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) {
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) {
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);
}
}
void filemon_method_dump_info(FILE *f) {
- int i;
fprintf(f,"inotify");
DUMPV("%d",,filemon_inotify_fd);
DUMPV("%d",filemon_inotify_watches.,count);