From: Cedric Bail Date: Fri, 22 Apr 2016 05:13:02 +0000 (-0700) Subject: ecore: forgot to handle recursive destruction in a function that actually ask for... X-Git-Tag: upstream/1.20.0~6659 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3b68135bafc13f5e71c46efe3f012876146e66cf;p=platform%2Fupstream%2Fefl.git ecore: forgot to handle recursive destruction in a function that actually ask for destruction. --- diff --git a/src/lib/ecore/ecore_idler.c b/src/lib/ecore/ecore_idler.c index 97c0639..c751a5a 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);