forked from enlightenment/efl
ecore: force fully resolve a future on cancel during recursive call.
This commit is contained in:
parent
0a46096337
commit
6321630d32
|
@ -95,6 +95,10 @@ _efl_loop_future_success(Efl_Event *ev, Efl_Loop_Future_Data *pd, void *value)
|
||||||
|
|
||||||
EINA_INLIST_FREE(pd->callbacks, cb)
|
EINA_INLIST_FREE(pd->callbacks, cb)
|
||||||
{
|
{
|
||||||
|
// Remove callback early to avoid double execution while
|
||||||
|
// doing recursive call
|
||||||
|
pd->callbacks = eina_inlist_remove(pd->callbacks, pd->callbacks);
|
||||||
|
|
||||||
if (cb->next)
|
if (cb->next)
|
||||||
{
|
{
|
||||||
chain_success.next = cb->next;
|
chain_success.next = cb->next;
|
||||||
|
@ -109,7 +113,6 @@ _efl_loop_future_success(Efl_Event *ev, Efl_Loop_Future_Data *pd, void *value)
|
||||||
chain_success.value = value;
|
chain_success.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
pd->callbacks = eina_inlist_remove(pd->callbacks, pd->callbacks);
|
|
||||||
free(cb);
|
free(cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -127,15 +130,35 @@ _efl_loop_future_failure(Efl_Event *ev, Efl_Loop_Future_Data *pd, Eina_Error err
|
||||||
|
|
||||||
EINA_INLIST_FREE(pd->callbacks, cb)
|
EINA_INLIST_FREE(pd->callbacks, cb)
|
||||||
{
|
{
|
||||||
|
// Remove callback early to avoid double execution while
|
||||||
|
// doing recursive call
|
||||||
|
pd->callbacks = eina_inlist_remove(pd->callbacks, pd->callbacks);
|
||||||
|
|
||||||
chain_fail.next = cb->next;
|
chain_fail.next = cb->next;
|
||||||
|
|
||||||
if (cb->failure) cb->failure((void*) cb->data, ev);
|
if (cb->failure) cb->failure((void*) cb->data, ev);
|
||||||
|
|
||||||
pd->callbacks = eina_inlist_remove(pd->callbacks, pd->callbacks);
|
|
||||||
free(cb);
|
free(cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_efl_loop_future_propagate_force(Eo *obj, Efl_Loop_Future_Data *pd)
|
||||||
|
{
|
||||||
|
Efl_Event ev;
|
||||||
|
|
||||||
|
ev.object = obj;
|
||||||
|
|
||||||
|
if (pd->promise->message->error == 0)
|
||||||
|
{
|
||||||
|
_efl_loop_future_success(&ev, pd, pd->message->value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_efl_loop_future_failure(&ev, pd, pd->message->error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_efl_loop_future_propagate(Eo *obj, Efl_Loop_Future_Data *pd)
|
_efl_loop_future_propagate(Eo *obj, Efl_Loop_Future_Data *pd)
|
||||||
{
|
{
|
||||||
|
@ -299,7 +322,14 @@ _efl_loop_future_cancel(Eo *obj, Efl_Loop_Future_Data *pd)
|
||||||
// We do allow for calling cancel during the propagation phase
|
// We do allow for calling cancel during the propagation phase
|
||||||
// as the other proper fix is to wype out all future reference before
|
// as the other proper fix is to wype out all future reference before
|
||||||
// starting propagating things.
|
// starting propagating things.
|
||||||
if (pd->promise && pd->promise->propagating) return;
|
if (pd->promise && pd->promise->propagating)
|
||||||
|
{
|
||||||
|
efl_ref(obj);
|
||||||
|
|
||||||
|
_efl_loop_future_propagate_force(obj, pd);
|
||||||
|
|
||||||
|
goto disconnect;
|
||||||
|
}
|
||||||
|
|
||||||
// Check state
|
// Check state
|
||||||
if (pd->fulfilled)
|
if (pd->fulfilled)
|
||||||
|
@ -322,6 +352,7 @@ _efl_loop_future_cancel(Eo *obj, Efl_Loop_Future_Data *pd)
|
||||||
|
|
||||||
_efl_loop_future_propagate(obj, pd);
|
_efl_loop_future_propagate(obj, pd);
|
||||||
|
|
||||||
|
disconnect:
|
||||||
_efl_loop_future_disconnect(obj, pd);
|
_efl_loop_future_disconnect(obj, pd);
|
||||||
|
|
||||||
efl_unref(obj);
|
efl_unref(obj);
|
||||||
|
|
Loading…
Reference in New Issue