From: Jaroslav Kysela Date: Wed, 21 Oct 2015 17:22:15 +0000 (+0200) Subject: DVR inotify: fix fundamental error when inotify filename is re-registered X-Git-Tag: v4.0.7~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f55871b5f6315f71364456d59160c5b136f1cb55;p=thirdparty%2Ftvheadend.git DVR inotify: fix fundamental error when inotify filename is re-registered --- diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index aff07dde8..b00e443d7 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -645,6 +645,7 @@ void dvr_inotify_init ( void ); void dvr_inotify_done ( void ); void dvr_inotify_add ( dvr_entry_t *de ); void dvr_inotify_del ( dvr_entry_t *de ); +int dvr_inotify_count( void ); /** * Cutpoints support diff --git a/src/dvr/dvr_inotify.c b/src/dvr/dvr_inotify.c index 2c29b8d44..19e52022c 100644 --- a/src/dvr/dvr_inotify.c +++ b/src/dvr/dvr_inotify.c @@ -56,6 +56,7 @@ static int _str_cmp ( void *a, void *b ) return strcmp(((dvr_inotify_entry_t*)a)->path, ((dvr_inotify_entry_t*)b)->path); } + /** * Initialise threads */ @@ -106,12 +107,13 @@ void dvr_inotify_add ( dvr_entry_t *de ) dvr_inotify_entry_skel->path = dirname(path); e = RB_INSERT_SORTED(&_inot_tree, dvr_inotify_entry_skel, link, _str_cmp); - if (!e) { - e = dvr_inotify_entry_skel; - SKEL_USED(dvr_inotify_entry_skel); - e->path = strdup(e->path); - e->fd = inotify_add_watch(_inot_fd, e->path, EVENT_MASK); - } + if (e) + return; + + e = dvr_inotify_entry_skel; + SKEL_USED(dvr_inotify_entry_skel); + e->path = strdup(e->path); + e->fd = inotify_add_watch(_inot_fd, e->path, EVENT_MASK); LIST_INSERT_HEAD(&e->entries, de, de_inotify_link); @@ -150,6 +152,21 @@ void dvr_inotify_del ( dvr_entry_t *de ) } } +/* + * return count of registered entries (for debugging) + */ +int dvr_inotify_count ( void ) +{ + dvr_entry_t *det = NULL; + dvr_inotify_entry_t *e; + int count = 0; + lock_assert(&global_lock); + RB_FOREACH(e, &_inot_tree, link) + LIST_FOREACH(det, &e->entries, de_inotify_link) + count++; + return count; +} + /* * Find inotify entry */