From 7c62154d52d7522b401ef0c362a75bbdad529d13 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Thu, 21 Apr 2016 13:40:33 -0700 Subject: [PATCH] ecore: allow for possible factorization of all idler event. --- src/lib/ecore/Ecore_Common.h | 2 +- src/lib/ecore/ecore_idler.c | 61 +++++++++++++++++++++++++------------------ src/lib/ecore/ecore_private.h | 9 +++++++ 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/lib/ecore/Ecore_Common.h b/src/lib/ecore/Ecore_Common.h index 7e61301..4585d6b 100644 --- a/src/lib/ecore/Ecore_Common.h +++ b/src/lib/ecore/Ecore_Common.h @@ -3033,7 +3033,7 @@ EAPI char *ecore_timer_dump(void); /* * @since 1.8 */ -typedef struct _Ecore_Idler Ecore_Idler; /**< A handle for idlers */ +typedef struct _Ecore_Factorized_Idle Ecore_Idler; /**< A handle for idlers */ /* * @since 1.8 diff --git a/src/lib/ecore/ecore_idler.c b/src/lib/ecore/ecore_idler.c index a946c66..db42928 100644 --- a/src/lib/ecore/ecore_idler.c +++ b/src/lib/ecore/ecore_idler.c @@ -9,56 +9,54 @@ #include "Ecore.h" #include "ecore_private.h" -struct _Ecore_Idler +struct _Ecore_Factorized_Idle { Ecore_Task_Cb func; void *data; -}; -static void *_ecore_idler_del(Ecore_Idler *idler); + const Eo_Callback_Array_Item *desc; +}; -static Eina_Bool -_ecore_idler_event_del(void *data, const Eo_Event *event EINA_UNUSED) +Eina_Bool +_ecore_factorized_idle_event_del(void *data, const Eo_Event *event EINA_UNUSED) { - _ecore_idler_del(data); + _ecore_factorized_idle_del(data); return EO_CALLBACK_CONTINUE; } -static Eina_Bool -_ecore_idler_process(void *data, const Eo_Event *event EINA_UNUSED) +Eina_Bool +_ecore_factorized_idle_process(void *data, const Eo_Event *event EINA_UNUSED) { - Ecore_Idler *idler = data; + Ecore_Factorized_Idle *idler = data; if (!_ecore_call_task_cb(idler->func, idler->data)) - _ecore_idler_del(idler); + _ecore_factorized_idle_del(idler); return EO_CALLBACK_CONTINUE; } -EO_CALLBACKS_ARRAY_DEFINE(ecore_idler_callbacks, - { ECORE_MAINLOOP_EVENT_IDLE, _ecore_idler_process }, - { EO_BASE_EVENT_DEL, _ecore_idler_event_del }); - -static void * -_ecore_idler_del(Ecore_Idler *idler) +void * +_ecore_factorized_idle_del(Ecore_Idler *idler) { void *data; if (!idler) return NULL; + EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); - eo_event_callback_array_del(_mainloop_singleton, ecore_idler_callbacks(), idler); + eo_event_callback_array_del(_mainloop_singleton, idler->desc, idler); data = idler->data; free(idler); return data; } -EAPI Ecore_Idler * -ecore_idler_add(Ecore_Task_Cb func, - const void *data) +Ecore_Factorized_Idle * +_ecore_factorized_idle_add(const Eo_Callback_Array_Item *desc, + Ecore_Task_Cb func, + const void *data) { - Ecore_Idler *ret; + Ecore_Factorized_Idle *ret; if (EINA_UNLIKELY(!eina_main_loop_is())) { @@ -76,19 +74,30 @@ ecore_idler_add(Ecore_Task_Cb func, ret->func = func; ret->data = (void*) data; + ret->desc = desc; - eo_event_callback_array_add(_mainloop_singleton, ecore_idler_callbacks(), ret); + eo_event_callback_array_add(_mainloop_singleton, desc, ret); return ret; } +/* Specific to Ecore_Idler implementation */ + +EO_CALLBACKS_ARRAY_DEFINE(ecore_idler_callbacks, + { ECORE_MAINLOOP_EVENT_IDLE, _ecore_factorized_idle_process }, + { EO_BASE_EVENT_DEL, _ecore_factorized_idle_event_del }); + +EAPI Ecore_Idler * +ecore_idler_add(Ecore_Task_Cb func, + const void *data) +{ + return _ecore_factorized_idle_add(ecore_idler_callbacks(), func, data); +} + EAPI void * ecore_idler_del(Ecore_Idler *idler) { - if (!idler) return NULL; - EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); - - return _ecore_idler_del(idler); + return _ecore_factorized_idle_del(idler); } void diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index 0a1b108..29d1db6 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -85,6 +85,8 @@ extern int _ecore_log_dom; # define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x))) #endif +typedef struct _Ecore_Factorized_Idle Ecore_Factorized_Idle; + typedef struct _Ecore_Mainloop_Data Ecore_Mainloop_Data; struct _Ecore_Mainloop_Data { @@ -171,6 +173,13 @@ int _ecore_timers_exists(void); int _ecore_timer_expired_call(double when); +Ecore_Factorized_Idle *_ecore_factorized_idle_add(const Eo_Callback_Array_Item*desc, + Ecore_Task_Cb func, + const void *data); +void *_ecore_factorized_idle_del(Ecore_Idler *idler); +Eina_Bool _ecore_factorized_idle_process(void *data, const Eo_Event *event); +Eina_Bool _ecore_factorized_idle_event_del(void *data, const Eo_Event *event); + void _ecore_idler_all_call(Eo *loop); int _ecore_idler_exist(Eo *loop); -- 2.7.4