From 1a82751cf12c242d9e679da3da3603eaf6773d5a Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 27 Feb 2012 13:20:05 +0000 Subject: [PATCH] eio: start implement fallback monitor. SVN revision: 68473 --- legacy/eio/src/lib/eio_inotify.c | 1 + legacy/eio/src/lib/eio_poll.c | 95 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/legacy/eio/src/lib/eio_inotify.c b/legacy/eio/src/lib/eio_inotify.c index 9eb3e88..a0a3b66 100644 --- a/legacy/eio/src/lib/eio_inotify.c +++ b/legacy/eio/src/lib/eio_inotify.c @@ -196,6 +196,7 @@ void eio_monitor_backend_add(Eio_Monitor *monitor) backend->hwnd = inotify_add_watch(ecore_main_fd_handler_fd_get(_inotify_fdh), monitor->path, mask); if (!backend->hwnd) return eio_monitor_fallback_add(monitor); + monitor->backend = backend; eina_hash_direct_add(_inotify_monitors, &backend->hwnd, backend); } diff --git a/legacy/eio/src/lib/eio_poll.c b/legacy/eio/src/lib/eio_poll.c index 396002c..005cfb3 100644 --- a/legacy/eio/src/lib/eio_poll.c +++ b/legacy/eio/src/lib/eio_poll.c @@ -22,8 +22,17 @@ struct _Eio_Monitor_Backend { + Eio_Monitor *parent; + + Ecore_Timer *timer; + Ecore_Idler *idler; + Ecore_Thread *work; + + Eina_Bool delete_me : 1; }; +static Eina_Bool _eio_monitor_fallback_timer_cb(void *data); + #if !defined HAVE_INOTIFY && !defined HAVE_NOTIFY_WIN32 void eio_monitor_backend_init(void) { @@ -44,6 +53,59 @@ void eio_monitor_backend_del(Eio_Monitor *monitor) } #endif +static void +_eio_monitor_fallback_heavy_cb(void *data, Ecore_Thread *thread) +{ + /* FIXME : copy ecore_file_monitor_poll here */ +} + +static void +_eio_monitor_fallback_end_cb(void *data, Ecore_Thread *thread) +{ + Eio_Monitor_Backend *backend = data; + + backend->work = NULL; + backend->timer = ecore_timer_add(60.0, _eio_monitor_fallback_timer_cb, backend); +} + +static void +_eio_monitor_fallback_cancel_cb(void *data, Ecore_Thread *thread) +{ + Eio_Monitor_Backend *backend = data; + + backend->work = NULL; + if (backend->delete_me) + { + free(backend); + return ; + } + backend->timer = ecore_timer_add(60.0, _eio_monitor_fallback_timer_cb, backend); +} + +static Eina_Bool +_eio_monitor_fallback_idler_cb(void *data) +{ + Eio_Monitor_Backend *backend = data; + + backend->idler = NULL; + backend->work = ecore_thread_run(_eio_monitor_fallback_heavy_cb, + _eio_monitor_fallback_end_cb, + _eio_monitor_fallback_cancel_cb, + backend); + return EINA_FALSE; +} + +static Eina_Bool +_eio_monitor_fallback_timer_cb(void *data) +{ + Eio_Monitor_Backend *backend = data; + + backend->timer = NULL; + backend->idler = ecore_idler_add(_eio_monitor_fallback_idler_cb, backend); + + return EINA_FALSE; +} + void eio_monitor_fallback_init(void) { @@ -55,11 +117,40 @@ eio_monitor_fallback_shutdown(void) } void -eio_monitor_fallback_add(Eio_Monitor *monitor __UNUSED__) +eio_monitor_fallback_add(Eio_Monitor *monitor) { + Eio_Monitor_Backend *backend; + + monitor->backend = NULL; + + backend = calloc(1, sizeof (Eio_Monitor_Backend)); + if (!backend) return ; + + backend->parent = monitor; + monitor->backend = backend; + backend->timer = ecore_timer_add(60.0, _eio_monitor_fallback_timer_cb, backend); } void -eio_monitor_fallback_del(Eio_Monitor *monitor __UNUSED__) +eio_monitor_fallback_del(Eio_Monitor *monitor) { + Eio_Monitor_Backend *backend; + + backend = monitor->backend; + monitor->backend = NULL; + + if (!backend) return ; + + backend->parent = NULL; + if (backend->timer) ecore_timer_del(backend->timer); + backend->timer = NULL; + if (backend->idler) ecore_idler_del(backend->idler); + backend->idler = NULL; + if (backend->work) + { + backend->delete_me = EINA_TRUE; + ecore_thread_cancel(backend->work); + return ; + } + free(backend); } -- 2.7.4