cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=3b68135bafc13f5e71c46efe3f012876146e66cf

commit 3b68135bafc13f5e71c46efe3f012876146e66cf
Author: Cedric Bail <ced...@osg.samsung.com>
Date:   Thu Apr 21 22:13:02 2016 -0700

    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 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);
 

-- 


Reply via email to