diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2018-02-02 16:59:56 -0500 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2018-02-02 16:59:44 -0500 |
commit | 26d73cbae1f28567673d5711e5dbbc964769aa67 (patch) | |
tree | d4ad8b8216f5e55ed7f03ebe641af8cab30d6c71 | |
parent | 5760b3f335d842767139d07fe08b4157382e1ad3 (diff) | |
download | efl-26d73cbae1f28567673d5711e5dbbc964769aa67.tar.gz |
eio: make inotify monitors fork-safe
@fix
-rw-r--r-- | src/lib/eio/eio_monitor_inotify.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/lib/eio/eio_monitor_inotify.c b/src/lib/eio/eio_monitor_inotify.c index 5ff54d5066..f3a83be5b7 100644 --- a/src/lib/eio/eio_monitor_inotify.c +++ b/src/lib/eio/eio_monitor_inotify.c @@ -157,8 +157,25 @@ _eio_inotify_handler(void *data EINA_UNUSED, Ecore_Fd_Handler *fdh) /** * @endcond */ +static Eina_Bool reseting; +static void +_eio_monitor_reset() +{ + Eina_Hash *h = _inotify_monitors; + Eina_Iterator *it; + Eio_Monitor_Backend *backend; - + _inotify_monitors = NULL; + reseting = 1; + eio_monitor_backend_shutdown(); + eio_monitor_backend_init(); + it = eina_hash_iterator_data_new(h); + EINA_ITERATOR_FOREACH(it, backend) + eio_monitor_backend_add(backend->parent); + reseting = 0; + eina_iterator_free(it); + eina_hash_free(h); +} /*============================================================================* * Global * *============================================================================*/ @@ -189,6 +206,8 @@ void eio_monitor_backend_init(void) } _inotify_monitors = eina_hash_int32_new(_eio_inotify_del); + if (!reseting) + ecore_fork_reset_callback_add(_eio_monitor_reset, NULL); } void eio_monitor_backend_shutdown(void) @@ -207,6 +226,8 @@ void eio_monitor_backend_shutdown(void) return; close(fd); + if (!reseting) + ecore_fork_reset_callback_del(_eio_monitor_reset, NULL); } void eio_monitor_backend_add(Eio_Monitor *monitor) |