forked from enlightenment/efl
ecore: fix reference counting of promise value for efl_future_race and efl_future_all.
This commit is contained in:
parent
cb8695e9d6
commit
e8fb89c156
|
@ -685,6 +685,15 @@ _efl_promise_race_future_get(void *item)
|
||||||
static void
|
static void
|
||||||
_efl_promise_all_free(Efl_Promise_All *all)
|
_efl_promise_all_free(Efl_Promise_All *all)
|
||||||
{
|
{
|
||||||
|
Efl_Future_All *fa;
|
||||||
|
Eina_Array_Iterator iterator;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
EINA_ARRAY_ITER_NEXT(&all->members, i, fa, iterator)
|
||||||
|
{
|
||||||
|
EINA_REFCOUNT_UNREF(fa->d)
|
||||||
|
_efl_promise_msg_free(fa->d);
|
||||||
|
}
|
||||||
efl_del(all->promise);
|
efl_del(all->promise);
|
||||||
all->promise = NULL;
|
all->promise = NULL;
|
||||||
}
|
}
|
||||||
|
@ -822,6 +831,9 @@ _efl_accessor_all_get_at(Efl_Accessor_All *ac, unsigned int pos, void **data)
|
||||||
{
|
{
|
||||||
Efl_Future_All *fa;
|
Efl_Future_All *fa;
|
||||||
|
|
||||||
|
if (eina_array_count(&ac->all->members) <= pos)
|
||||||
|
return EINA_FALSE;
|
||||||
|
|
||||||
fa = eina_array_data_get(&ac->all->members, pos);
|
fa = eina_array_data_get(&ac->all->members, pos);
|
||||||
if (!fa) return EINA_FALSE;
|
if (!fa) return EINA_FALSE;
|
||||||
|
|
||||||
|
@ -965,7 +977,7 @@ _efl_future_all_new(Eo *provider)
|
||||||
|
|
||||||
eina_array_step_set(&all->members, sizeof (Eina_Array), 8);
|
eina_array_step_set(&all->members, sizeof (Eina_Array), 8);
|
||||||
all->future_get = _efl_promise_all_future_get;
|
all->future_get = _efl_promise_all_future_get;
|
||||||
all->promise = efl_add(EFL_PROMISE_CLASS, NULL);
|
all->promise = efl_add(EFL_PROMISE_CLASS, loop);
|
||||||
if (!all->promise) goto on_error;
|
if (!all->promise) goto on_error;
|
||||||
|
|
||||||
return all;
|
return all;
|
||||||
|
@ -1046,7 +1058,7 @@ efl_future_iterator_all(Eina_Iterator *it)
|
||||||
|
|
||||||
EINA_ITERATOR_FOREACH(it, fn)
|
EINA_ITERATOR_FOREACH(it, fn)
|
||||||
{
|
{
|
||||||
if (!all) _efl_future_all_new(fn);
|
if (!all) all = _efl_future_all_new(fn);
|
||||||
if (!all) goto on_error;
|
if (!all) goto on_error;
|
||||||
if (!_efl_future_all_append(all, fn))
|
if (!_efl_future_all_append(all, fn))
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
@ -1057,7 +1069,7 @@ efl_future_iterator_all(Eina_Iterator *it)
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
eina_iterator_free(it);
|
eina_iterator_free(it);
|
||||||
_efl_promise_all_die(all, NULL);
|
if (all) _efl_promise_all_die(all, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1213,10 +1225,16 @@ efl_future_iterator_race(Eina_Iterator *it)
|
||||||
EINA_ITERATOR_FOREACH(it, fn)
|
EINA_ITERATOR_FOREACH(it, fn)
|
||||||
{
|
{
|
||||||
if (!race) race = _efl_future_race_new(fn);
|
if (!race) race = _efl_future_race_new(fn);
|
||||||
if (race) eina_array_push(&race->members, fn);
|
if (!race) goto on_error;
|
||||||
|
eina_array_push(&race->members, fn);
|
||||||
}
|
}
|
||||||
|
eina_iterator_free(it);
|
||||||
|
|
||||||
return _efl_future_race_done(race);
|
return _efl_future_race_done(race);
|
||||||
|
|
||||||
|
on_error:
|
||||||
|
eina_iterator_free(it);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "efl_promise.eo.c"
|
#include "efl_promise.eo.c"
|
||||||
|
|
Loading…
Reference in New Issue