chiark / gitweb /
compatibility version check
[ypp-sc-tools.db-test.git] / pctb / ocr.c
index 43636f2d1c18861d77d890e8f49c2373a1bff627..df4aacfbb05e299e09642f66115abfbe0bd8b584 100644 (file)
@@ -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,32 @@ 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","1",(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<nsofar; i++, s++) {
@@ -138,30 +148,37 @@ static void callout_unknown(int w, int h, Pixcol cols[],
   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();