From 8af403fcffd2f01e64db34b46b4fcd2b8015ac37 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 2 Aug 2011 07:23:05 +0000 Subject: [PATCH] fix edje_shutdown being calle3d before all edje object are deleted - keep edje internal data around until all refs to edje are gone from objects, then shtudown the core. SVN revision: 61984 --- legacy/edje/src/lib/edje_main.c | 39 ++++++++++++++++++++++++------ legacy/edje/src/lib/edje_private.h | 3 +++ legacy/edje/src/lib/edje_smart.c | 3 +++ 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 43069bd5ba..5cc7b98254 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -107,16 +107,12 @@ edje_init(void) return --_edje_init_count; } +static int _edje_users = 0; -EAPI int -edje_shutdown(void) +static void +_edje_shutdown_core(void) { - if (--_edje_init_count != 0) - return _edje_init_count; - - if (_edje_timer) - ecore_animator_del(_edje_timer); - _edje_timer = NULL; + if (_edje_users > 0) return; _edje_file_cache_shutdown(); _edje_color_class_members_free(); @@ -141,6 +137,33 @@ edje_shutdown(void) eina_log_domain_unregister(_edje_default_log_dom); _edje_default_log_dom = -1; eina_shutdown(); +} + +void +_edje_lib_ref(void) +{ + _edje_users++; +} + +void +_edje_lib_unref(void) +{ + _edje_users--; + if (_edje_users != 0) return; + if (_edje_init_count == 0) _edje_shutdown_core(); +} + +EAPI int +edje_shutdown(void) +{ + if (--_edje_init_count != 0) + return _edje_init_count; + + if (_edje_timer) + ecore_animator_del(_edje_timer); + _edje_timer = NULL; + + _edje_shutdown_core(); return _edje_init_count; } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 985c82fe8a..07a901eb1e 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -1883,4 +1883,7 @@ const char *edje_string_id_get(const Edje_String *es); void _edje_object_orientation_inform(Evas_Object *obj); +void _edje_lib_ref(void); +void _edje_lib_unref(void); + #endif diff --git a/legacy/edje/src/lib/edje_smart.c b/legacy/edje/src/lib/edje_smart.c index 2b847e28a7..5d1440da97 100644 --- a/legacy/edje/src/lib/edje_smart.c +++ b/legacy/edje/src/lib/edje_smart.c @@ -23,6 +23,8 @@ edje_object_add(Evas *evas) { Evas_Object *e; + _edje_lib_ref(); + if (!_edje_smart) { memset(&_edje_smart_parent, 0, sizeof(_edje_smart_parent)); @@ -150,6 +152,7 @@ _edje_smart_del(Evas_Object * obj) _edje_file_del(ed); _edje_clean_objects(ed); _edje_unref(ed); + _edje_lib_unref(); } static void