summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2016-04-21 11:57:14 -0700
committerCedric BAIL <cedric@osg.samsung.com>2016-04-21 12:07:50 -0700
commit3ff21c021d348eaeba0c0f034efedd5eda551234 (patch)
tree1e1c8a6cd9244023ebf2aba050545f3c48f5b653
parent559d4e8b68cba8da58ceba70d4e637f8190e23ec (diff)
downloadefl-3ff21c021d348eaeba0c0f034efedd5eda551234.tar.gz
ecore: move Ecore_Idler to legacy and rely on Eo event restart capability.
-rw-r--r--src/Makefile_Ecore.am1
-rw-r--r--src/lib/ecore/Ecore_Common.h4
-rw-r--r--src/lib/ecore/Ecore_Eo.h1
-rw-r--r--src/lib/ecore/Ecore_Legacy.h3
-rw-r--r--src/lib/ecore/ecore.c1
-rw-r--r--src/lib/ecore/ecore_idler.c197
-rw-r--r--src/lib/ecore/ecore_idler.eo28
-rw-r--r--src/lib/ecore/ecore_main.c69
-rw-r--r--src/lib/ecore/ecore_mainloop.eo5
-rw-r--r--src/lib/ecore/ecore_private.h11
10 files changed, 130 insertions, 190 deletions
diff --git a/src/Makefile_Ecore.am b/src/Makefile_Ecore.am
index 78a256d6f0..141194578b 100644
--- a/src/Makefile_Ecore.am
+++ b/src/Makefile_Ecore.am
@@ -6,7 +6,6 @@ ecore_eolian_files_legacy = \
lib/ecore/ecore_poller.eo \
lib/ecore/ecore_job.eo \
lib/ecore/ecore_exe.eo \
- lib/ecore/ecore_idler.eo \
lib/ecore/ecore_idle_enterer.eo \
lib/ecore/ecore_idle_exiter.eo \
lib/ecore/ecore_animator.eo
diff --git a/src/lib/ecore/Ecore_Common.h b/src/lib/ecore/Ecore_Common.h
index 47024af465..7e613016d6 100644
--- a/src/lib/ecore/Ecore_Common.h
+++ b/src/lib/ecore/Ecore_Common.h
@@ -3033,9 +3033,7 @@ EAPI char *ecore_timer_dump(void);
/*
* @since 1.8
*/
-typedef Eo Ecore_Idler; /**< A handle for idlers */
-
-#define _ECORE_IDLER_EO_CLASS_TYPE
+typedef struct _Ecore_Idler Ecore_Idler; /**< A handle for idlers */
/*
* @since 1.8
diff --git a/src/lib/ecore/Ecore_Eo.h b/src/lib/ecore/Ecore_Eo.h
index 00005268ad..1dce5fdb88 100644
--- a/src/lib/ecore/Ecore_Eo.h
+++ b/src/lib/ecore/Ecore_Eo.h
@@ -47,7 +47,6 @@ extern "C" {
* @{
*/
-#include "ecore_idler.eo.h"
#include "ecore_idle_exiter.eo.h"
#include "ecore_idle_enterer.eo.h"
diff --git a/src/lib/ecore/Ecore_Legacy.h b/src/lib/ecore/Ecore_Legacy.h
index ab9df2d843..f0acb5d6b2 100644
--- a/src/lib/ecore/Ecore_Legacy.h
+++ b/src/lib/ecore/Ecore_Legacy.h
@@ -246,6 +246,7 @@ EAPI void ecore_timer_thaw(Ecore_Timer *timer);
*
* @{
*/
+
/**
* Add an idler handler.
* @param func The function to call when idling.
@@ -321,8 +322,6 @@ EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(Ecore_Task_Cb func, const void *da
*/
EAPI void *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
-#include "ecore_idler.eo.legacy.h"
-
/**
* @}
*/
diff --git a/src/lib/ecore/ecore.c b/src/lib/ecore/ecore.c
index 1f31476baa..48d823fd46 100644
--- a/src/lib/ecore/ecore.c
+++ b/src/lib/ecore/ecore.c
@@ -402,7 +402,6 @@ ecore_shutdown(void)
#endif
_ecore_idle_enterer_shutdown();
_ecore_idle_exiter_shutdown();
- _ecore_idler_shutdown();
_ecore_timer_shutdown();
_ecore_event_shutdown();
_ecore_main_shutdown();
diff --git a/src/lib/ecore/ecore_idler.c b/src/lib/ecore/ecore_idler.c
index 54f08cf921..a946c660d4 100644
--- a/src/lib/ecore/ecore_idler.c
+++ b/src/lib/ecore/ecore_idler.c
@@ -9,183 +9,98 @@
#include "Ecore.h"
#include "ecore_private.h"
-#define MY_CLASS ECORE_IDLER_CLASS
-
-#define MY_CLASS_NAME "Ecore_Idler"
-
-struct _Ecore_Idler_Data
+struct _Ecore_Idler
{
- EINA_INLIST;
- Ecore_Idler *obj;
Ecore_Task_Cb func;
void *data;
- int references;
- Eina_Bool delete_me : 1;
};
-typedef struct _Ecore_Idler_Data Ecore_Idler_Data;
-static Ecore_Idler_Data *idlers = NULL;
-static Ecore_Idler_Data *idler_current = NULL;
-static int idlers_delete_me = 0;
-
-static void *
-_ecore_idler_del(Ecore_Idler *idler);
+static void *_ecore_idler_del(Ecore_Idler *idler);
-EAPI Ecore_Idler *
-ecore_idler_add(Ecore_Task_Cb func,
- const void *data)
+static Eina_Bool
+_ecore_idler_event_del(void *data, const Eo_Event *event EINA_UNUSED)
{
- return eo_add(MY_CLASS, _ecore_parent, ecore_idler_constructor(eo_self, func, data));
+ _ecore_idler_del(data);
+
+ return EO_CALLBACK_CONTINUE;
}
-EOLIAN static void
-_ecore_idler_constructor(Eo *obj, Ecore_Idler_Data *ie, Ecore_Task_Cb func, const void *data)
+static Eina_Bool
+_ecore_idler_process(void *data, const Eo_Event *event EINA_UNUSED)
{
- if (EINA_UNLIKELY(!eina_main_loop_is()))
- {
- EINA_MAIN_LOOP_CHECK_RETURN;
- }
+ Ecore_Idler *idler = data;
- ie->obj = obj;
- eo_manual_free_set(obj, EINA_TRUE);
+ if (!_ecore_call_task_cb(idler->func, idler->data))
+ _ecore_idler_del(idler);
- if (!func)
- {
- ERR("callback function must be set up for an object of class: '%s'", MY_CLASS_NAME);
- return;
- }
-
- ie->func = func;
- ie->data = (void *)data;
- idlers = (Ecore_Idler_Data *)eina_inlist_append(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
+ return EO_CALLBACK_CONTINUE;
}
-EAPI void *
-ecore_idler_del(Ecore_Idler *idler)
-{
- if (!idler) return NULL;
- EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
-
- return _ecore_idler_del(idler);
-}
+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 *obj)
+_ecore_idler_del(Ecore_Idler *idler)
{
- Ecore_Idler_Data *idler = eo_data_scope_get(obj, MY_CLASS);
+ void *data;
+
if (!idler) return NULL;
- EINA_SAFETY_ON_TRUE_RETURN_VAL(idler->delete_me, NULL);
- idler->delete_me = 1;
- idlers_delete_me = 1;
- return idler->data;
-}
-EOLIAN static void
-_ecore_idler_eo_base_destructor(Eo *obj, Ecore_Idler_Data *idler)
-{
- idler->delete_me = 1;
- idlers_delete_me = 1;
+ eo_event_callback_array_del(_mainloop_singleton, ecore_idler_callbacks(), idler);
- eo_destructor(eo_super(obj, MY_CLASS));
+ data = idler->data;
+ free(idler);
+ return data;
}
-EOLIAN static Eo *
-_ecore_idler_eo_base_finalize(Eo *obj, Ecore_Idler_Data *idler)
+EAPI Ecore_Idler *
+ecore_idler_add(Ecore_Task_Cb func,
+ const void *data)
{
- if (!idler->func)
+ Ecore_Idler *ret;
+
+ if (EINA_UNLIKELY(!eina_main_loop_is()))
{
+ EINA_MAIN_LOOP_CHECK_RETURN;
+ }
+
+ if (!func)
+ {
+ ERR("callback function must be set up for an object of Ecore_Idler.");
return NULL;
}
- return eo_finalize(eo_super(obj, MY_CLASS));
+ ret = malloc(sizeof (Ecore_Idler));
+ if (!ret) return NULL;
+
+ ret->func = func;
+ ret->data = (void*) data;
+
+ eo_event_callback_array_add(_mainloop_singleton, ecore_idler_callbacks(), ret);
+
+ return ret;
}
-void
-_ecore_idler_shutdown(void)
+EAPI void *
+ecore_idler_del(Ecore_Idler *idler)
{
- Ecore_Idler_Data *ie;
- while ((ie = idlers))
- {
- idlers = (Ecore_Idler_Data *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(idlers));
+ if (!idler) return NULL;
+ EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL);
- eo_parent_set(ie->obj, NULL);
- if (eo_destructed_is(ie->obj))
- eo_manual_free(ie->obj);
- else
- eo_manual_free_set(ie->obj, EINA_FALSE);
- }
- idlers_delete_me = 0;
- idler_current = NULL;
+ return _ecore_idler_del(idler);
}
-int
-_ecore_idler_all_call(void)
+void
+_ecore_idler_all_call(Eo *loop)
{
- if (!idler_current)
- {
- /* regular main loop, start from head */
- idler_current = idlers;
- }
- else
- {
- /* recursive main loop, continue from where we were */
- idler_current = (Ecore_Idler_Data *)EINA_INLIST_GET(idler_current)->next;
- }
-
- while (idler_current)
- {
- Ecore_Idler_Data *ie = (Ecore_Idler_Data *)idler_current;
- if (!ie->delete_me)
- {
- ie->references++;
- eina_evlog("+idler", ie, 0.0, NULL);
- if (!_ecore_call_task_cb(ie->func, ie->data))
- {
- if (!ie->delete_me) _ecore_idler_del(ie->obj);
- }
- eina_evlog("-idler", ie, 0.0, NULL);
- ie->references--;
- }
- if (idler_current) /* may have changed in recursive main loops */
- idler_current = (Ecore_Idler_Data *)EINA_INLIST_GET(idler_current)->next;
- }
- if (idlers_delete_me)
- {
- Ecore_Idler_Data *l;
- int deleted_idlers_in_use = 0;
- for (l = idlers; l; )
- {
- Ecore_Idler_Data *ie = l;
- l = (Ecore_Idler_Data *)EINA_INLIST_GET(l)->next;
- if (ie->delete_me)
- {
- if (ie->references)
- {
- deleted_idlers_in_use++;
- continue;
- }
-
- idlers = (Ecore_Idler_Data *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie));
-
- eo_parent_set(ie->obj, NULL);
- if (eo_destructed_is(ie->obj))
- eo_manual_free(ie->obj);
- else
- eo_manual_free_set(ie->obj, EINA_FALSE);
- }
- }
- if (!deleted_idlers_in_use)
- idlers_delete_me = 0;
- }
- if (idlers) return 1;
- return 0;
+ eo_event_callback_call(loop, ECORE_MAINLOOP_EVENT_IDLE, NULL);
}
int
-_ecore_idler_exist(void)
+_ecore_idler_exist(Eo *loop)
{
- if (idlers) return 1;
- return 0;
-}
+ Ecore_Mainloop_Data *dt = eo_data_scope_get(loop, ECORE_MAINLOOP_CLASS);
-#include "ecore_idler.eo.c"
+ return dt->idlers;
+}
diff --git a/src/lib/ecore/ecore_idler.eo b/src/lib/ecore/ecore_idler.eo
deleted file mode 100644
index bf25d4ae34..0000000000
--- a/src/lib/ecore/ecore_idler.eo
+++ /dev/null
@@ -1,28 +0,0 @@
-import ecore_types;
-
-class Ecore.Idler (Eo.Base)
-{
- [[Setup callbacks to be called when the program is in idle state.
-
- Once the mainloop has called all enterer handlers it calls the registered
- idler callbacks.
- ]]
- eo_prefix: ecore_idler;
- methods {
- constructor {
- [[Constructor.]]
- legacy: null;
- params {
- @in func: Ecore_Task_Cb; [[Idler callback function.]]
- @in data: const(void)*; [[Private data passed to callback functions.]]
- }
- }
- }
- implements {
- Eo.Base.destructor;
- Eo.Base.finalize;
- }
- constructors {
- .constructor;
- }
-}
diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c
index 4a6f52d3c6..dcf3bf0d81 100644
--- a/src/lib/ecore/ecore_main.c
+++ b/src/lib/ecore/ecore_main.c
@@ -722,7 +722,7 @@ _ecore_main_gsource_prepare(GSource *source EINA_UNUSED,
if (g_main_loop_is_running(ecore_main_loop))
{
/* only set idling state in dispatch */
- if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
+ if (ecore_idling && !_ecore_idler_exist(_mainloop_singleton) && !_ecore_event_exist())
{
if (_ecore_timers_exists())
{
@@ -791,7 +791,7 @@ _ecore_main_gsource_check(GSource *source EINA_UNUSED)
in_main_loop++;
/* check if old timers expired */
- if (ecore_idling && !_ecore_idler_exist() && !_ecore_event_exist())
+ if (ecore_idling && !_ecore_idler_exist(_mainloop_singleton) && !_ecore_event_exist())
{
if (timer_fd >= 0)
{
@@ -846,7 +846,7 @@ _ecore_main_gsource_dispatch(GSource *source EINA_UNUSED,
events_ready = _ecore_event_exist();
timers_ready = _ecore_timers_exists() && (0.0 == next_time);
- idlers_ready = _ecore_idler_exist();
+ idlers_ready = _ecore_idler_exist(_mainloop_singleton);
in_main_loop++;
DBG("enter idling=%d fds=%d events=%d timers=%d (next=%.2f) idlers=%d",
@@ -866,7 +866,7 @@ _ecore_main_gsource_dispatch(GSource *source EINA_UNUSED,
if (ecore_idling)
{
- _ecore_idler_all_call();
+ _ecore_idler_all_call(_mainloop_singleton);
events_ready = _ecore_event_exist();
@@ -2091,9 +2091,9 @@ _ecore_main_loop_uv_prepare(uv_prepare_t* handle EINA_UNUSED)
double t = -1;
if(_ecore_main_uv_idling)
{
- _ecore_idler_all_call();
+ _ecore_idler_all_call(_mainloop_singleton);
DBG("called idles");
- if(_ecore_idler_exist() || _ecore_event_exist())
+ if(_ecore_idler_exist(_mainloop_singleton) || _ecore_event_exist())
t = 0.0;
}
@@ -2159,8 +2159,10 @@ _ecore_main_loop_spin_core(void)
{
/* as we are spinning we need to update loop time per spin */
_ecore_time_loop_time = ecore_time_get();
- /* call all idlers, which returns false if no more idelrs exist */
- if (!_ecore_idler_all_call()) return SPIN_RESTART;
+ /* call all idlers */
+ _ecore_idler_all_call(_mainloop_singleton);
+ /* which returns false if no more idelrs exist */
+ if (!_ecore_idler_exist(_mainloop_singleton)) return SPIN_RESTART;
/* sneaky - drop through or if checks - the first one to succeed
* drops through and returns "continue" so further ones dont run */
if ((_ecore_main_select(0.0) > 0) || (_ecore_event_exist()) ||
@@ -2305,7 +2307,7 @@ start_loop: /*-*************************************************************/
/* init flags */
next_time = _ecore_timer_next_get();
/* no idlers */
- if (!_ecore_idler_exist())
+ if (!_ecore_idler_exist(_mainloop_singleton))
{
/* sleep until timeout or forever (-1.0) waiting for on fds */
_ecore_main_select(next_time);
@@ -2764,4 +2766,53 @@ _ecore_mainloop_animator_ticked(Eo *obj EINA_UNUSED, Ecore_Mainloop_Data *pd EIN
return ecore_main_loop_animator_ticked_get();
}
+static Eina_Bool
+_check_event_catcher_add(void *data, const Eo_Event *event)
+{
+ const Eo_Callback_Array_Item *array = event->info;
+ Ecore_Mainloop_Data *pd = data;
+ int i;
+
+ for (i = 0; array[i].desc != NULL; i++)
+ {
+ if (array[i].desc == ECORE_MAINLOOP_EVENT_IDLE)
+ {
+ ++pd->idlers;
+ }
+ }
+
+ return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+_check_event_catcher_del(void *data, const Eo_Event *event)
+{
+ const Eo_Callback_Array_Item *array = event->info;
+ Ecore_Mainloop_Data *pd = data;
+ int i;
+
+ for (i = 0; array[i].desc != NULL; i++)
+ {
+ if (array[i].desc == ECORE_MAINLOOP_EVENT_IDLE)
+ {
+ --pd->idlers;
+ }
+ }
+
+ return EO_CALLBACK_CONTINUE;
+}
+
+EO_CALLBACKS_ARRAY_DEFINE(event_catcher_watch,
+ { EO_BASE_EVENT_CALLBACK_ADD, _check_event_catcher_add },
+ { EO_BASE_EVENT_CALLBACK_DEL, _check_event_catcher_del });
+
+EOLIAN static Eo_Base *
+_ecore_mainloop_eo_base_constructor(Eo *obj, Ecore_Mainloop_Data *pd)
+{
+ eo_constructor(eo_super(obj, ECORE_MAINLOOP_CLASS));
+ eo_event_callback_array_add(obj, event_catcher_watch(), pd);
+
+ return obj;
+}
+
#include "ecore_mainloop.eo.c"
diff --git a/src/lib/ecore/ecore_mainloop.eo b/src/lib/ecore/ecore_mainloop.eo
index 076cb46c06..1b04de1fb5 100644
--- a/src/lib/ecore/ecore_mainloop.eo
+++ b/src/lib/ecore/ecore_mainloop.eo
@@ -52,7 +52,10 @@ class Ecore_Mainloop (Eo.Base)
events {
idle,enter @restart; [[Event occurs once the main loop enters the idle state.]]
idle,exit @restart; [[Event occurs once the main loop exits the idle state.]]
- idle @restart; /* FIXME: We need to make sure we can get it work. */
+ idle @restart; [[Event occurs once the main loop is idler. Be carefull, this will spin your CPU high if you keep listening on this event.]]
/* TODO: All of the legacy ecore events. (Ecore.h header) */
}
+ implements {
+ Eo.Base.constructor;
+ }
}
diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h
index 547a9473a0..0a1b1082eb 100644
--- a/src/lib/ecore/ecore_private.h
+++ b/src/lib/ecore/ecore_private.h
@@ -85,6 +85,12 @@ extern int _ecore_log_dom;
# define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
#endif
+typedef struct _Ecore_Mainloop_Data Ecore_Mainloop_Data;
+struct _Ecore_Mainloop_Data
+{
+ int idlers;
+};
+
#define EVAS_FRAME_QUEUING 1 /* for test */
#define READBUFSIZ 65536
@@ -165,9 +171,8 @@ int _ecore_timers_exists(void);
int _ecore_timer_expired_call(double when);
-void _ecore_idler_shutdown(void);
-int _ecore_idler_all_call(void);
-int _ecore_idler_exist(void);
+void _ecore_idler_all_call(Eo *loop);
+int _ecore_idler_exist(Eo *loop);
void _ecore_idle_enterer_shutdown(void);
void _ecore_idle_enterer_call(void);