From 9b5287de46abd24ab7bdbc7c2c83e5d01e593709 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 1 Jun 2010 19:59:37 +0100 Subject: [PATCH] WIP new filemon with linked list not array --- filemon.c | 59 ++++++++++++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/filemon.c b/filemon.c index 0c8a1d0..fe7a638 100644 --- a/filemon.c +++ b/filemon.c @@ -33,42 +33,32 @@ #include -static int filemon_inotify_fd; -static int filemon_inotify_wdmax; -static InputFile **filemon_inotify_wd2ipf; +DEFLIST(Filemon_Perfile); struct Filemon_Perfile { + ISNODE(Filemon_Perfile); + InputFile *ipf; int wd; }; -static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) { - int wd= inotify_add_watch(filemon_inotify_fd, ipf->path, IN_MODIFY); - if (wd < 0) sysdie("inotify_add_watch %s", ipf->path); - - if (wd >= filemon_inotify_wdmax) { - int newmax= wd+2; - filemon_inotify_wd2ipf= xrealloc(filemon_inotify_wd2ipf, - sizeof(*filemon_inotify_wd2ipf) * newmax); - memset(filemon_inotify_wd2ipf + filemon_inotify_wdmax, 0, - sizeof(*filemon_inotify_wd2ipf) * (newmax - filemon_inotify_wdmax)); - filemon_inotify_wdmax= newmax; - } +static int filemon_inotify_fd; +static Filemon_PerfileList filemon_inotify_watches; - assert(!filemon_inotify_wd2ipf[wd]); - filemon_inotify_wd2ipf[wd]= ipf; +static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) { + pf->ipf= ipf; - dbg("filemon inotify startfile %p wd=%d wdmax=%d", - ipf, wd, filemon_inotify_wdmax); + pf->wd= inotify_add_watch(filemon_inotify_fd, ipf->path, IN_MODIFY); + if (pf->wd < 0) sysdie("inotify_add_watch %s", ipf->path); - pf->wd= wd; + LIST_ADDHEAD(filemon_inotify_watches, pf); + dbg("filemon inotify startfile %p wd=%d pf=%p", ipf, wd, pf); } static void filemon_method_stopfile(InputFile *ipf, Filemon_Perfile *pf) { - int wd= pf->wd; - dbg("filemon inotify stopfile %p wd=%d", ipf, wd); - int r= inotify_rm_watch(filemon_inotify_fd, wd); + dbg("filemon inotify stopfile %p wd=%d pf=%p", ipf, pf->wd, pf); + int r= inotify_rm_watch(filemon_inotify_fd, pf->wd); if (r) syscrash("inotify_rm_watch"); - filemon_inotify_wd2ipf[wd]= 0; + LIST_REMOVE(filemon_inotify_watches, pf); } static void *filemon_inotify_readable(oop_source *lp, int fd, @@ -79,12 +69,15 @@ static void *filemon_inotify_readable(oop_source *lp, int fd, if (r==-1) { if (isewouldblock(errno)) break; syscrash("read from inotify master"); - } else if (r==sizeof(iev)) { - assert(iev.wd >= 0 && iev.wd < filemon_inotify_wdmax); - } else { + } else if (r!=sizeof(iev)) { crash("inotify read %d bytes wanted struct of %d", r, (int)sizeof(iev)); } - InputFile *ipf= filemon_inotify_wd2ipf[iev.wd]; + 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); + found: + InputFile *ipf= pf->ipf; /*dbg("filemon inotify readable read %p wd=%d", ipf, iev.wd);*/ tailing_make_readable(ipf); } @@ -92,6 +85,7 @@ static void *filemon_inotify_readable(oop_source *lp, int fd, } int filemon_method_init(void) { + LIST_INIT(filemon_inotify_watches); filemon_inotify_fd= inotify_init(); if (filemon_inotify_fd<0) { syswarn("filemon/inotify: inotify_init failed"); @@ -108,11 +102,11 @@ void filemon_method_dump_info(FILE *f) { int i; fprintf(f,"inotify"); DUMPV("%d",,filemon_inotify_fd); - DUMPV("%d",,filemon_inotify_wdmax); + DUMPV("%d",filemon_inotify_watches.,count); fprintf(f,"\n"); - for (i=0; iipf, pf->wd, pf); } #endif /* HAVE_INOTIFY && !HAVE_FILEMON */ @@ -148,4 +142,3 @@ void filemon_stop(InputFile *ipf) { free(ipf->filemon); ipf->filemon= 0; } - -- 2.30.2