eio: start implement fallback monitor.
authorCedric BAIL <cedric.bail@free.fr>
Mon, 27 Feb 2012 13:20:05 +0000 (13:20 +0000)
committerCedric BAIL <cedric.bail@free.fr>
Mon, 27 Feb 2012 13:20:05 +0000 (13:20 +0000)
SVN revision: 68473

legacy/eio/src/lib/eio_inotify.c
legacy/eio/src/lib/eio_poll.c

index 9eb3e88..a0a3b66 100644 (file)
@@ -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);
 }
index 396002c..005cfb3 100644 (file)
 
 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);
 }