From: Ian Jackson Date: Thu, 4 Jun 2009 18:56:01 +0000 (+0100) Subject: New show-thing IPC X-Git-Tag: 1.9.2~186 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=commitdiff_plain;h=909b1d69c7cafc7b50d932a0c1f790c9f91cb430 New show-thing IPC --- diff --git a/pctb/database b/pctb/database index 83daefb..65c84ff 100644 --- a/pctb/database +++ b/pctb/database @@ -34,6 +34,13 @@ fc0 820 820 820 +1 1 65 +5 +7c0 +920 +920 +920 +9c0 1 1 6e 5 fe0 diff --git a/pctb/ocr.c b/pctb/ocr.c index 43636f2..7f3be26 100644 --- a/pctb/ocr.c +++ b/pctb/ocr.c @@ -25,6 +25,7 @@ static int aresults, nresults; static FILE *resolver; static pid_t resolver_pid; +static int resolver_done; static void ocr_readdb(void) { int ctx,nchrs; @@ -91,23 +92,31 @@ static void ocr_readdb(void) { static void callout_unknown(int w, int h, Pixcol cols[], int unk_l, int unk_r, int unk_ctx, const OcrResultGlyph *sofar, int nsofar) { - int pfd[2], c, r,i, x,y; + int jobpipe[2],donepipe[2], c, r,i, x,y; const OcrResultGlyph *s; const char *p; + char cb; Pixcol pv; if (!resolver) { - r= pipe(pfd); eassert(!r); + r= pipe(jobpipe); eassert(!r); + r= pipe(donepipe); eassert(!r); resolver_pid= fork(); eassert(resolver_pid!=-1); if (!resolver_pid) { - r= dup2(pfd[0],0); eassert(!r); - r= close(pfd[1]); eassert(!r); - execlp("./show-thing.tcl", "./show-thing.tcl",(char*)0); + r= dup2(jobpipe[0],0); eassert(r==0); + r= close(jobpipe[1]); eassert(!r); + r= close(donepipe[0]); eassert(!r); + /* we know donepipe[1] is >= 4 and we have dealt with all the others + * so we aren't in any danger of overwriting some other fd 4: */ + r= dup2(donepipe[1],4); eassert(r==4); + execlp("./show-thing.tcl", "./show-thing.tcl","--automatic",(char*)0); eassert(!"execlp failed"); } - r= close(pfd[0]); eassert(!r); - resolver= fdopen(pfd[1],"w"); eassert(resolver); + r= close(jobpipe[0]); eassert(!r); + r= close(donepipe[1]); eassert(!r); + resolver= fdopen(jobpipe[1],"w"); eassert(resolver); + resolver_done= donepipe[0]; } fprintf(resolver,"%d %d %d",unk_l,unk_r,unk_ctx); for (i=0, s=sofar; i&4} + fileevent stdin readable required +} + +switch -exact -- $argv { + {} { set mainkind test } + --automatic { set mainkind automatic } + default { error "huh $argv ?" } +} + read_database -fconfigure stdin -blocking no -fileevent stdin readable required +main/$mainkind