cedric pushed a commit to branch master.

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

commit 5882c30a987cb632a3b9cf53edf49086e3bff471
Author: Cedric BAIL <[email protected]>
Date:   Fri Dec 16 10:19:37 2016 -0800

    ecore: refactor promise propagation code.
---
 src/lib/ecore/efl_promise.c | 66 ++++++++++++++++++---------------------------
 1 file changed, 26 insertions(+), 40 deletions(-)

diff --git a/src/lib/ecore/efl_promise.c b/src/lib/ecore/efl_promise.c
index 52d2819..32ab6e0 100644
--- a/src/lib/ecore/efl_promise.c
+++ b/src/lib/ecore/efl_promise.c
@@ -552,39 +552,22 @@ _efl_promise_message_new(Efl_Promise_Data *pd)
 }
 
 static void
-_efl_promise_value_set(Eo *obj, Efl_Promise_Data *pd, void *v, Eina_Free_Cb 
free_cb)
+_efl_promise_propagate(Eo *obj, Efl_Promise_Data *pd)
 {
-   Efl_Promise_Msg *message;
    Efl_Loop_Future_Data *f;
    Eina_List *l, *ln;
 
-   if (pd->message)
-     {
-        ERR("This promise has already been fulfilled. You can can't set a 
value twice nor can you set a value after it has been cancelled.");
-        return ;
-     }
-
    // By triggering this message, we are likely going to kill all future
    // And a user of the promise may want to attach an event handler on the 
promise
    // and destroy it, so delay that to after the loop is done.
    efl_ref(obj);
 
-   // Create a refcounted structure where refcount == number of future + one
-   message = _efl_promise_message_new(pd);
-   if (!message) return ;
-
-   message->value = v;
-   message->free_cb = free_cb;
-
-   EINA_REFCOUNT_INIT(message);
-   pd->message = message;
-
    // Send it to all futures
    pd->propagating++;
    EINA_LIST_FOREACH_SAFE(pd->futures, l, ln, f)
      {
-        EINA_REFCOUNT_REF(message);
-        f->message = message;
+        EINA_REFCOUNT_REF(pd->message);
+        f->message = pd->message;
 
         // Trigger the callback
         _efl_loop_future_propagate(f->self, f);
@@ -596,11 +579,9 @@ _efl_promise_value_set(Eo *obj, Efl_Promise_Data *pd, void 
*v, Eina_Free_Cb free
 }
 
 static void
-_efl_promise_failed_set(Eo *obj, Efl_Promise_Data *pd, Eina_Error err)
+_efl_promise_value_set(Eo *obj, Efl_Promise_Data *pd, void *v, Eina_Free_Cb 
free_cb)
 {
    Efl_Promise_Msg *message;
-   Efl_Loop_Future_Data *f;
-   Eina_List *l, *ln;
 
    if (pd->message)
      {
@@ -608,34 +589,39 @@ _efl_promise_failed_set(Eo *obj, Efl_Promise_Data *pd, 
Eina_Error err)
         return ;
      }
 
-   // By triggering this message, we are likely going to kill all future
-   // And a user of the promise may want to attach an event handler on the 
promise
-   // and destroy it, so delay that to after the loop is done.
-   efl_ref(obj);
-
    // Create a refcounted structure where refcount == number of future + one
    message = _efl_promise_message_new(pd);
    if (!message) return ;
 
-   message->error = err;
+   message->value = v;
+   message->free_cb = free_cb;
 
    EINA_REFCOUNT_INIT(message);
    pd->message = message;
 
-   // Send it to each future
-   pd->propagating++;
-   EINA_LIST_FOREACH_SAFE(pd->futures, l, ln, f)
-     {
-        EINA_REFCOUNT_REF(message);
-        f->message = message;
+   _efl_promise_propagate(obj, pd);
+}
 
-        // Trigger the callback
-        _efl_loop_future_propagate(f->self, f);
+static void
+_efl_promise_failed_set(Eo *obj, Efl_Promise_Data *pd, Eina_Error err)
+{
+   Efl_Promise_Msg *message;
+
+   if (pd->message)
+     {
+        ERR("This promise has already been fulfilled. You can can't set a 
value twice nor can you set a value after it has been cancelled.");
+        return ;
      }
-   pd->propagating--;
+   // Create a refcounted structure where refcount == number of future + one
+   message = _efl_promise_message_new(pd);
+   if (!message) return ;
 
-   // Now, we may die.
-   efl_unref(obj);
+   message->error = err;
+
+   EINA_REFCOUNT_INIT(message);
+   pd->message = message;
+
+   _efl_promise_propagate(obj, pd);
 }
 
 static void

-- 


Reply via email to