raster pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=8934ada4d8d9576e270defda5877589abdd2345d
commit 8934ada4d8d9576e270defda5877589abdd2345d Author: Carsten Haitzler (Rasterman) <[email protected]> Date: Thu Nov 24 11:15:00 2016 +0900 e_util_defer_object_del - ensure order of deferred deletions are right so since e_util_defer_object_del used a before idler this would reverse deletion order vs the order submitted. this may cause issues. not sure. chasing netstar's "animator stops" issue, but if defered deletion if disabled seems to stop it from happening. at least fix order if multiple deferred deletions are queued @fix --- src/bin/e_utils.c | 64 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/bin/e_utils.c b/src/bin/e_utils.c index 5b4dc56..5db1631 100644 --- a/src/bin/e_utils.c +++ b/src/bin/e_utils.c @@ -710,6 +710,36 @@ e_util_dir_check(const char *dir) return 1; } +static Eina_Array *_delay_del_array = NULL; +static Ecore_Idle_Enterer *_delay_del_idler = NULL; + +static Eina_Bool +_e_util_cb_delayed_del(void *data EINA_UNUSED) +{ + while (_delay_del_array) + { + Eina_Array *arr = _delay_del_array; + Eina_Iterator *itr = eina_array_iterator_new(arr); + void *ptr; + + _delay_del_array = NULL; + while (eina_iterator_next(itr, &ptr)) + { + if (ptr) e_object_del(E_OBJECT(ptr)); + } + eina_array_free(arr); + } + _delay_del_idler = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +_e_util_cb_delayed_cancel(void *data, void *obj EINA_UNUSED) +{ + unsigned long c = (unsigned long)data; + if (_delay_del_array) eina_array_data_set(_delay_del_array, c, NULL); +} + E_API void e_util_defer_object_del(E_Object *obj) { @@ -717,10 +747,21 @@ e_util_defer_object_del(E_Object *obj) e_object_del(obj); else { - Ecore_Idle_Enterer *idler; - - idler = ecore_idle_enterer_before_add(_e_util_cb_delayed_del, obj); - if (idler) e_object_delfn_add(obj, _e_util_cb_delayed_cancel, idler); + if (!_delay_del_array) + { + _delay_del_array = eina_array_new(8); + if (!_delay_del_idler) + _delay_del_idler = ecore_idle_enterer_before_add + (_e_util_cb_delayed_del, NULL); + } + if (_delay_del_array) + { + if (eina_array_push(_delay_del_array, obj)) + { + unsigned long c = eina_array_count_get(_delay_del_array); + e_object_delfn_add(obj, _e_util_cb_delayed_cancel, (void *)c); + } + } } } @@ -818,21 +859,6 @@ _e_util_icon_add(const char *path, Evas *evas, int size) } static Eina_Bool -_e_util_cb_delayed_del(void *data) -{ - e_object_del(E_OBJECT(data)); - return ECORE_CALLBACK_CANCEL; -} - -static void -_e_util_cb_delayed_cancel(void *data, void *obj EINA_UNUSED) -{ - Ecore_Idle_Enterer *idler = data; - - ecore_idle_enterer_del(idler); -} - -static Eina_Bool _e_util_wakeup_cb(void *data EINA_UNUSED) { _e_util_dummy_timer = NULL; --
