ecore: fix optional future promise to not complain of there destruction.

This commit is contained in:
Cedric BAIL 2016-08-30 16:20:36 -07:00
parent 8e8c50e7a1
commit cb17d46cf5
1 changed files with 19 additions and 1 deletions

View File

@ -31,6 +31,8 @@ struct _Efl_Promise_Data
Eina_Bool progress : 1; Eina_Bool progress : 1;
Eina_Bool progress_triggered : 1; Eina_Bool progress_triggered : 1;
} set; } set;
Eina_Bool optional : 1;
}; };
static void static void
@ -218,17 +220,25 @@ _efl_loop_future_then(Eo *obj, Efl_Loop_Future_Data *pd,
Efl_Event_Cb success, Efl_Event_Cb failure, Efl_Event_Cb progress, const void *data) Efl_Event_Cb success, Efl_Event_Cb failure, Efl_Event_Cb progress, const void *data)
{ {
Efl_Loop_Future_Callback *cb; Efl_Loop_Future_Callback *cb;
Efl_Promise_Data *epd;
Efl_Future *f; Efl_Future *f;
cb = _efl_loop_future_then_internal(pd, success, failure, progress, data); cb = _efl_loop_future_then_internal(pd, success, failure, progress, data);
if (!cb) return NULL; if (!cb) return NULL;
efl_ref(obj);
cb->next = efl_add(EFL_PROMISE_CLASS, obj); cb->next = efl_add(EFL_PROMISE_CLASS, obj);
epd = efl_data_scope_get(cb->next, EFL_PROMISE_CLASS);
epd->optional = EINA_TRUE;
f = efl_promise_future_get(cb->next); f = efl_promise_future_get(cb->next);
_efl_loop_future_prepare_events(pd, !!progress, EINA_FALSE); _efl_loop_future_prepare_events(pd, !!progress, EINA_FALSE);
_efl_loop_future_fulfilling(obj, pd); _efl_loop_future_fulfilling(obj, pd);
efl_unref(obj);
return f; return f;
} }
@ -242,9 +252,13 @@ _efl_loop_future_internal_then(Efl_Future *f,
cb = _efl_loop_future_then_internal(pd, success, failure, progress, data); cb = _efl_loop_future_then_internal(pd, success, failure, progress, data);
if (!cb) return EINA_FALSE; if (!cb) return EINA_FALSE;
efl_ref(f);
_efl_loop_future_prepare_events(pd, !!progress, EINA_TRUE); _efl_loop_future_prepare_events(pd, !!progress, EINA_TRUE);
_efl_loop_future_fulfilling(f, pd); _efl_loop_future_fulfilling(f, pd);
efl_unref(f);
return EINA_FALSE; return EINA_FALSE;
} }
@ -292,9 +306,13 @@ _efl_loop_future_cancel(Eo *obj, Efl_Loop_Future_Data *pd)
pd->fulfilled = EINA_TRUE; pd->fulfilled = EINA_TRUE;
// Trigger failure // Trigger failure
efl_ref(obj);
_efl_loop_future_propagate(obj, pd); _efl_loop_future_propagate(obj, pd);
_efl_loop_future_disconnect(obj, pd); _efl_loop_future_disconnect(obj, pd);
efl_unref(obj);
} }
static void static void
@ -574,7 +592,7 @@ _efl_promise_efl_object_destructor(Eo *obj, Efl_Promise_Data *pd)
// Unref refcounted structure // Unref refcounted structure
if (!pd->message && pd->futures) if (!pd->message && pd->futures)
{ {
ERR("This promise has not been fulfilled. Forcefully cancelling %p.", obj); if (!pd->optional) ERR("This promise has not been fulfilled. Forcefully cancelling %p.", obj);
efl_promise_failed(obj, EINA_ERROR_FUTURE_CANCEL); efl_promise_failed(obj, EINA_ERROR_FUTURE_CANCEL);
} }