chiark / gitweb /
Report input file start to debug log
[innduct.git] / infile.c
index 3fc1ff6c945500db7c68e5ef69fe0ede2eecc2d0..73e291b839dcc6b1c82e809d00e602ed956a8465 100644 (file)
--- a/infile.c
+++ b/infile.c
@@ -59,6 +59,8 @@ InputFile *open_input_file(const char *path) {
   LIST_INIT(ipf->queue);
   strcpy(ipf->path, path);
 
+  dbg("started input file %p %s", ipf, path);
+
   return ipf;
 }
 
@@ -77,11 +79,13 @@ static void *feedfile_got_bad_data(InputFile *ipf, off_t offset,
                                   const char *data, const char *how) {
   warn("corrupted file: %s, offset %lu: %s: in %s",
        ipf->path, (unsigned long)offset, how, sanitise(data,-1));
-  ipf->readcount_err++;
-  if (ipf->readcount_err > max_bad_data_initial +
-      (ipf->readcount_ok+ipf->readcount_blank) / max_bad_data_ratio)
+  ipf->counts.events[read_err]++;
+  if (ipf->counts.events[read_err] > max_bad_data_initial +
+      (ipf->counts.events[read_ok] + ipf->counts.events[read_blank])
+                                                  / max_bad_data_ratio)
     crash("too much garbage in input file!  (%d errs, %d ok, %d blank)",
-         ipf->readcount_err, ipf->readcount_ok, ipf->readcount_blank);
+         ipf->counts.events[read_err], ipf->counts.events[read_ok],
+         ipf->counts.events[read_blank]);
   return OOP_CONTINUE;
 }
 
@@ -129,7 +133,7 @@ static void *feedfile_got_article(oop_source *lp, oop_read *rd,
 
   if (data[0]==' ') {
     if (strspn(data," ") != recsz) X_BAD_DATA("line partially blanked");
-    ipf->readcount_blank++;
+    ipf->counts.events[read_blank]++;
     return OOP_CONTINUE;
   }
 
@@ -144,7 +148,7 @@ static void *feedfile_got_article(oop_source *lp, oop_read *rd,
   tokentextbuf[tokenlen]= 0;
   if (!IsToken(tokentextbuf)) X_BAD_DATA("token wrong syntax");
 
-  ipf->readcount_ok++;
+  ipf->counts.events[read_ok]++;
 
   art= xmalloc(sizeof(*art) - 1 + midlen + 1);
   memset(art,0,sizeof(*art));
@@ -176,47 +180,57 @@ static void *feedfile_got_article(oop_source *lp, oop_read *rd,
 
 /*========== tailing input file ==========*/
 
+static void tailing_rable_on_time(InputFile *ipf);
+
 static void *tailing_rable_call_time(oop_source *lp, struct timeval tv,
                                     void *user) {
   /* lifetime of ipf here is OK because destruction will cause
    * on_cancel which will cancel this callback */
   InputFile *ipf= user;
 
-  dbg("**TRACT** ipf=%p called",ipf);
+  //dbg("**TRACT** ipf=%p called",ipf);
   if (!ipf->fake_readable) return OOP_CONTINUE;
 
   /* we just keep calling readable until our caller (oop_rd)
    * has called try_read, and try_read has found EOF so given EAGAIN */
-  dbg("**TRACT** ipf=%p reschedule",ipf);
-  loop->on_time(loop, OOP_TIME_NOW, tailing_rable_call_time, ipf);
+  //dbg("**TRACT** ipf=%p reschedule",ipf);
+  tailing_rable_on_time(ipf);
 
+  assert(ipf->readable_callback);
   return ipf->readable_callback(loop, &ipf->readable,
                                ipf->readable_callback_user);
 }
 
+static void tailing_rable_on_time(InputFile *ipf) {
+  loop->cancel_time(loop, OOP_TIME_NOW, tailing_rable_call_time, ipf);
+  loop->on_time(loop, OOP_TIME_NOW, tailing_rable_call_time, ipf);
+  /* on_time is not idempotent - it counts.   So we need this to make
+   * sure we only have one outstanding, as otherwise our cancel doesn't work */
+}
+
 static void tailing_on_cancel(struct oop_readable *rable) {
   InputFile *ipf= (void*)rable;
-  dbg("**TOR** ipf=%p on_cancel",ipf);
+  //dbg("**TOR** ipf=%p on_cancel",ipf);
 
   if (ipf->filemon) filemon_stop(ipf);
-  dbg("**TRACT** ipf=%p cancel",ipf);
+  //dbg("**TRACT** ipf=%p cancel",ipf);
   loop->cancel_time(loop, OOP_TIME_NOW, tailing_rable_call_time, ipf);
   ipf->readable_callback= 0;
 }
 
 void tailing_make_readable(InputFile *ipf) {
-  dbg("**TRACT** ipf=%p makereadable rcb=%p",ipf,
-      (void*)ipf?ipf->readable_callback:0);
+  //dbg("**TRACT** ipf=%p makereadable rcb=%p",ipf,
+  //    (void*)ipf?ipf->readable_callback:0);
   if (!ipf || !ipf->readable_callback) /* so callers can be naive */
     return;
   ipf->fake_readable= 1;
-  loop->on_time(loop, OOP_TIME_NOW, tailing_rable_call_time, ipf);
+  tailing_rable_on_time(ipf);
 }
 
 static int tailing_on_readable(struct oop_readable *rable,
                                oop_readable_call *cb, void *user) {
   InputFile *ipf= (void*)rable;
-  dbg("**TOR** ipf=%p on_readable",ipf);
+  //dbg("**TOR** ipf=%p on_readable",ipf);
 
   tailing_on_cancel(rable);
   ipf->readable_callback= cb;
@@ -250,7 +264,7 @@ static ssize_t tailing_try_read(struct oop_readable *rable, void *buffer,
        abort();
       }
     }
-    dbg("**TOR** ipf=%p try_read r=%d",ipf,r);
+    //dbg("**TOR** ipf=%p try_read r=%d",ipf,r);
     return r;
   }
 }