Efl_Promise_Msg *message;
Eina_List *futures;
+ unsigned char propagating;
+
struct {
Eina_Bool future : 1;
Eina_Bool future_triggered : 1;
} set;
Eina_Bool optional : 1;
- Eina_Bool propagating : 1;
};
static void
#ifndef NDEBUG
int wref;
#endif
+ unsigned char propagating;
Eina_Bool fulfilled : 1;
Eina_Bool death : 1;
chain_success.value = value;
+ pd->propagating++;
EINA_INLIST_FREE(pd->callbacks, cb)
{
// Remove callback early to avoid double execution while
free(cb);
}
+ pd->propagating--;
}
static void
chain_fail.error = error;
+ pd->propagating++;
EINA_INLIST_FREE(pd->callbacks, cb)
{
// Remove callback early to avoid double execution while
free(cb);
}
+ pd->propagating--;
}
static void
// We do allow for calling cancel during the propagation phase
// as the other proper fix is to wype out all future reference before
// starting propagating things.
- if (pd->promise && pd->promise->propagating)
+ if (pd->propagating ||
+ (pd->promise && pd->promise->propagating))
{
efl_ref(obj);
_efl_loop_future_propagate(obj, pd);
- disconnect:
_efl_loop_future_disconnect(obj, pd);
+ disconnect:
efl_unref(obj);
}
pd->message = message;
// Send it to all futures
- pd->propagating = EINA_TRUE;
+ pd->propagating++;
EINA_LIST_FOREACH_SAFE(pd->futures, l, ln, f)
{
EINA_REFCOUNT_REF(message);
// Trigger the callback
_efl_loop_future_propagate(f->self, f);
}
- pd->propagating = EINA_FALSE;
+ pd->propagating--;
// Now, we may die.
efl_unref(obj);
pd->message = message;
// Send it to each future
- pd->propagating = EINA_TRUE;
+ pd->propagating++;
EINA_LIST_FOREACH_SAFE(pd->futures, l, ln, f)
{
EINA_REFCOUNT_REF(message);
// Trigger the callback
_efl_loop_future_propagate(f->self, f);
}
- pd->propagating = EINA_FALSE;
+ pd->propagating--;
// Now, we may die.
efl_unref(obj);