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)
{
}
#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)
{
}
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);
}