static FILE *resolver;
static pid_t resolver_pid;
+static int resolver_done;
static void ocr_readdb(void) {
int ctx,nchrs;
eassert(feof(db));
}
-static void callout_unknown(int w, int h, Pixcol cols[], int unk_l, int unk_r,
+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",unk_l,unk_r);
+ fprintf(resolver,"%d %d %d",unk_l,unk_r,unk_ctx);
for (i=0, s=sofar; i<nsofar; i++, s++) {
fprintf(resolver," %d %d %d ",s->l,s->r,s->ctx);
for (p=s->s; (c= *p); p++) {
eassert(!ferror(resolver));
eassert(!fflush(resolver));
+ eassert(resolver);
+
for (;;) {
- eassert(resolver);
- pid_t pid= waitpid(resolver_pid, &r, WUNTRACED);
- if (pid==-1) { eassert(errno==EINTR); continue; }
+ r= read(resolver_done,&cb,1);
+ if (r==-1) { eassert(errno==EINTR); continue; }
+ break;
+ }
+
+ if (r==0) {
+ pid_t pid;
+ for (;;) {
+ pid= waitpid(resolver_pid, &r, 0);
+ if (pid==-1) { eassert(errno==EINTR); continue; }
+ break;
+ }
eassert(pid==resolver_pid);
if (WIFEXITED(r)) {
eassert(!WEXITSTATUS(r));
fclose(resolver);
+ close(resolver_done);
resolver= 0;
- } else if (WIFSTOPPED(r)) {
- r= kill(resolver_pid,SIGCONT);
- eassert(!r);
} else if (WIFSIGNALED(r)) {
eassert(!"resolver child died due to signal");
} else {
eassert(!"weird wait status");
}
- struct stat stab, fstab;
- r= stat("database",&stab); eassert(!r);
- r= fstat(fileno(db),&fstab); eassert(!r);
- if (stab.st_ino != fstab.st_ino ||
- stab.st_dev != fstab.st_dev)
- break;
+ } else {
+ eassert(r==1);
+ eassert(cb==0);
}
+
fclose(db);
db= 0;
ocr_readdb();
} else {
int rx;
fprintf(debug," UNKNOWN");
- for (rx=lx+1; rx<w && cols[rx]; rx++);
+ for (rx=lx; rx<w && cols[rx]; rx++);
fprintf(debug," x=%d ctx=%d %d..%d\n",x, ctx, lx,rx);
debug_flush();
- callout_unknown(w,h,cols, lx,rx, results,nresults);
+ callout_unknown(w,h,cols, lx,rx-1,ctx, results,nresults);
goto restart;
}
}