From 6cd108513b2424b85ac138b768384f3647bfd690 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 24 Nov 2016 11:15:00 +0900 Subject: [PATCH] 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 5b4dc56d8..5db1631d3 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); + } + } } } @@ -817,21 +858,6 @@ _e_util_icon_add(const char *path, Evas *evas, int size) return o; } -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) {