From 3b68135bafc13f5e71c46efe3f012876146e66cf Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Thu, 21 Apr 2016 22:13:02 -0700 Subject: [PATCH] ecore: forgot to handle recursive destruction in a function that actually ask for destruction. --- src/lib/ecore/ecore_idler.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/lib/ecore/ecore_idler.c b/src/lib/ecore/ecore_idler.c index 97c06396c1..c751a5ae25 100644 --- a/src/lib/ecore/ecore_idler.c +++ b/src/lib/ecore/ecore_idler.c @@ -15,6 +15,9 @@ struct _Ecore_Factorized_Idle void *data; const Eo_Callback_Array_Item *desc; + + short references; + Eina_Bool delete_me : 1; }; Eina_Bool @@ -30,7 +33,13 @@ _ecore_factorized_idle_process(void *data, const Eo_Event *event EINA_UNUSED) { Ecore_Factorized_Idle *idler = data; + idler->references++; if (!_ecore_call_task_cb(idler->func, idler->data)) + idler->delete_me = EINA_TRUE; + idler->references--; + + if (idler->delete_me && + idler->references == 0) _ecore_factorized_idle_del(idler); return EO_CALLBACK_CONTINUE; @@ -44,6 +53,12 @@ _ecore_factorized_idle_del(Ecore_Idler *idler) if (!idler) return NULL; EINA_MAIN_LOOP_CHECK_RETURN_VAL(NULL); + if (idler->references > 0) + { + idler->delete_me = EINA_TRUE; + return idler->data; + } + eo_event_callback_array_del(_mainloop_singleton, idler->desc, idler); data = idler->data; @@ -75,6 +90,8 @@ _ecore_factorized_idle_add(const Eo_Callback_Array_Item *desc, ret->func = func; ret->data = (void*) data; ret->desc = desc; + ret->references = 0; + ret->delete_me = EINA_FALSE; eo_event_callback_array_add(_mainloop_singleton, desc, ret);