chiark / gitweb /
make new filemon work
authorIan Jackson <ian@chiark.greenend.org.uk>
Tue, 1 Jun 2010 19:14:32 +0000 (20:14 +0100)
committerIan Jackson <ian@chiark.greenend.org.uk>
Tue, 1 Jun 2010 19:14:32 +0000 (20:14 +0100)
filemon.c

index fe7a638..7ba11b5 100644 (file)
--- a/filemon.c
+++ b/filemon.c
@@ -51,7 +51,7 @@ static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) {
   if (pf->wd < 0) sysdie("inotify_add_watch %s", ipf->path);
 
   LIST_ADDHEAD(filemon_inotify_watches, pf);
-  dbg("filemon inotify startfile %p wd=%d pf=%p", ipf, wd, pf);
+  dbg("filemon inotify startfile %p wd=%d pf=%p", ipf, pf->wd, pf);
 }
 
 static void filemon_method_stopfile(InputFile *ipf, Filemon_Perfile *pf) {
@@ -64,6 +64,7 @@ static void filemon_method_stopfile(InputFile *ipf, Filemon_Perfile *pf) {
 static void *filemon_inotify_readable(oop_source *lp, int fd,
                                      oop_event e, void *u) {
   struct inotify_event iev;
+  InputFile *ipf;
   for (;;) {
     int r= read(filemon_inotify_fd, &iev, sizeof(iev));
     if (r==-1) {
@@ -75,9 +76,17 @@ static void *filemon_inotify_readable(oop_source *lp, int fd,
     Filemon_Perfile *pf;
     FOR_LIST_NODE(pf, filemon_inotify_watches)
       if (pf->wd == iev.wd) goto found;
-    crash("inotify read event on unknown wd=%p", iev.wd);
+    /* Linux seems to remember events and can produce them even after
+     * you've removed the watch.  This means that we can't spot bugs
+     * where we lose track of our watches and have to just regard
+     * unexpected random watch events as normal.  It's not a
+     * correctness problem as the watch is just a prod to read a file,
+     * which is harmless if it does not need to be read. */
+    dbg("inotify read event on unknown wd=%d", iev.wd);
+    continue;
+    
   found:
-    InputFile *ipf= pf->ipf;
+    ipf= pf->ipf;
     /*dbg("filemon inotify readable read %p wd=%d", ipf, iev.wd);*/
     tailing_make_readable(ipf);
   }
@@ -99,7 +108,6 @@ int filemon_method_init(void) {
 }
 
 void filemon_method_dump_info(FILE *f) {
-  int i;
   fprintf(f,"inotify");
   DUMPV("%d",,filemon_inotify_fd);
   DUMPV("%d",filemon_inotify_watches.,count);