raster pushed a commit to branch master.

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

commit d80ef6d7a98e0cb3ceb995573c58d1df965639e4
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sat Mar 3 17:15:10 2018 +0900

    efl loop promises - cleare out promise data to null
    
    so there is something broken in the complect efl promise/loop promise
    that the clear of promises on loop destroy is clearing
    promises/futures that have already triggered (loop timer ones). i've
    spent enough time figuring out that it is happening.
    _efl_loop_timeout_del() simple doenst ensure the future in
    pending_futures for that promise is removed from the list. getting the
    future from the promise handle is an exercise in pain... so i'm not
    continuing with that path and will just ignore it.
    
    but for now filling the promise data with null at least means if the
    menory is re-used after free it wont see garbage freed ptrs and get
    nulls so its easier to track.
---
 src/lib/ecore/efl_loop.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/lib/ecore/efl_loop.c b/src/lib/ecore/efl_loop.c
index 0ccee1706f..b3a58f9ae9 100644
--- a/src/lib/ecore/efl_loop.c
+++ b/src/lib/ecore/efl_loop.c
@@ -488,7 +488,10 @@ static void
 _efl_loop_idle_cancel(void *data, const Eina_Promise *dead_ptr EINA_UNUSED)
 {
    Efl_Loop_Promise_Simple_Data *d = data;
+
    ecore_idler_del(d->idler);
+   d->idler = NULL;
+   d->promise = NULL;
    efl_loop_promise_simple_data_mp_free(d);
 }
 
@@ -497,6 +500,8 @@ _efl_loop_idle_done(void *data)
 {
    Efl_Loop_Promise_Simple_Data *d = data;
    eina_promise_resolve(d->promise, EINA_VALUE_EMPTY);
+   d->idler = NULL;
+   d->promise = NULL;
    efl_loop_promise_simple_data_mp_free(d);
    return EINA_FALSE;
 }
@@ -523,6 +528,8 @@ _efl_loop_idle(Eo *obj, Efl_Loop_Data *pd EINA_UNUSED)
    return efl_future_Eina_FutureXXX_then(obj, eina_future_new(p));
 
 idler_error:
+   d->idler = NULL;
+   d->promise = NULL;
    efl_loop_promise_simple_data_mp_free(d);
    return NULL;
 }
@@ -552,6 +559,7 @@ _efl_loop_timeout_del(void *data, const Efl_Event *event 
EINA_UNUSED)
    Efl_Loop_Promise_Simple_Data *d = data;
 
    d->timer = NULL;
+   d->promise = NULL;
    efl_loop_promise_simple_data_mp_free(d);
 }
 
@@ -585,6 +593,8 @@ _efl_loop_timeout(Eo *obj, Efl_Loop_Data *pd EINA_UNUSED, 
double tim)
    return efl_future_Eina_FutureXXX_then(obj, eina_future_new(p));
 
 timer_error:
+   d->timer = NULL;
+   d->promise = NULL;
    efl_loop_promise_simple_data_mp_free(d);
    return NULL;
 }
@@ -759,7 +769,6 @@ _env_sync(Efl_Loop_Data *pd, Efl_Task_Data *td)
                {
                   if (pd->env.environ_copy[i] != environ[i])
                     {
-                       printf("  env %i mismatch\n", i);
                        update = EINA_TRUE;
                        break;
                     }

-- 


Reply via email to