From a17ebe021de835ae814f6c41470ce2010ca7f64e Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 28 Jul 2005 14:09:09 +0000 Subject: [PATCH] defer evas destruction until idle time :) SVN revision: 15933 --- legacy/ecore/src/lib/ecore_evas/ecore_evas.c | 76 +++++++++++++------ .../ecore/src/lib/ecore_evas/ecore_evas_fb.c | 6 +- .../src/lib/ecore_evas/ecore_evas_private.h | 3 + .../ecore/src/lib/ecore_evas/ecore_evas_x.c | 10 ++- 4 files changed, 66 insertions(+), 29 deletions(-) diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c index b6e57cdf14..dfc7a31b75 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas.c @@ -6,6 +6,8 @@ static int _ecore_evas_init_count = 0; +static int _ecore_evas_idle_enter_delete(void *data); + /** * Query if a particular renginering engine target has support * @param engine The engine to check support for @@ -110,31 +112,10 @@ ecore_evas_free(Ecore_Evas *ee) "ecore_evas_free"); return; } - ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE); - while (ee->sub_ecore_evas) - { - ecore_evas_free(ee->sub_ecore_evas->data); - } - if (ee->data) evas_hash_free(ee->data); - if (ee->driver) free(ee->driver); - if (ee->name) free(ee->name); - if (ee->prop.title) free(ee->prop.title); - if (ee->prop.name) free(ee->prop.name); - if (ee->prop.clas) free(ee->prop.clas); - if (ee->prop.cursor.file) free(ee->prop.cursor.file); - if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); - if (ee->evas) evas_free(ee->evas); - ee->data = NULL; - ee->driver = NULL; - ee->name = NULL; - ee->prop.title = NULL; - ee->prop.name = NULL; - ee->prop.clas = NULL; - ee->prop.cursor.file = NULL; - ee->prop.cursor.object = NULL; - ee->evas = NULL; - if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); - free(ee); + if (ee->delete_idle_enterer) return; + ee->delete_idle_enterer = + ecore_idle_enterer_add(_ecore_evas_idle_enter_delete, ee); + return; } void * @@ -1603,3 +1584,48 @@ _ecore_evas_fps_debug_rendertime_add(double t) } } #endif + +void +_ecore_evas_free(Ecore_Evas *ee) +{ + ECORE_MAGIC_SET(ee, ECORE_MAGIC_NONE); + if (ee->delete_idle_enterer) + { + ecore_idle_enterer_del(ee->delete_idle_enterer); + ee->delete_idle_enterer = NULL; + } + while (ee->sub_ecore_evas) + { + ecore_evas_free(ee->sub_ecore_evas->data); + } + if (ee->data) evas_hash_free(ee->data); + if (ee->driver) free(ee->driver); + if (ee->name) free(ee->name); + if (ee->prop.title) free(ee->prop.title); + if (ee->prop.name) free(ee->prop.name); + if (ee->prop.clas) free(ee->prop.clas); + if (ee->prop.cursor.file) free(ee->prop.cursor.file); + if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); + if (ee->evas) evas_free(ee->evas); + ee->data = NULL; + ee->driver = NULL; + ee->name = NULL; + ee->prop.title = NULL; + ee->prop.name = NULL; + ee->prop.clas = NULL; + ee->prop.cursor.file = NULL; + ee->prop.cursor.object = NULL; + ee->evas = NULL; + if (ee->engine.func->fn_free) ee->engine.func->fn_free(ee); + free(ee); +} + +static int +_ecore_evas_idle_enter_delete(void *data) +{ + Ecore_Evas *ee; + + ee = (Ecore_Evas *)data; + _ecore_evas_free(ee); + return 0; +} diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c index b0a6d2abe4..f78631e639 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_fb.c @@ -64,7 +64,9 @@ _ecore_evas_fb_match(void) Ecore_Evas *ee; ee = (Ecore_Evas *)l; - return ee; + if (ee->delete_idle_enterer) continue; + else + return ee; } return NULL; } @@ -404,7 +406,7 @@ _ecore_evas_fb_shutdown(void) { int i; - while (ecore_evases) ecore_evas_free(ecore_evases); + while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 5; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); ecore_idle_enterer_del(ecore_evas_idle_enterer); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index 675816d10b..f4a3e32a3b 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -139,6 +139,8 @@ struct _Ecore_Evas char visible : 1; char should_be_visible : 1; + Ecore_Idle_Enterer *delete_idle_enterer; + Evas_Hash *data; struct { @@ -212,5 +214,6 @@ void _ecore_evas_buffer_render(Ecore_Evas *ee); void _ecore_evas_fps_debug_init(void); void _ecore_evas_fps_debug_shutdown(void); void _ecore_evas_fps_debug_rendertime_add(double t); +void _ecore_evas_free(Ecore_Evas *ee); #endif diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c index 243ddb6141..d168df4ed0 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_x.c @@ -27,12 +27,14 @@ _ecore_evas_x_render(Ecore_Evas *ee) Evas_List *ll; #endif + if (ee->delete_idle_enterer) return; #ifdef BUILD_ECORE_EVAS_BUFFER for (ll = ee->sub_ecore_evas; ll; ll = ll->next) { Ecore_Evas *ee2; ee2 = ll->data; + if (ee2->delete_idle_enterer) continue; if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2); _ecore_evas_buffer_render(ee2); if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2); @@ -250,7 +252,11 @@ _ecore_evas_x_winid_str_get(Ecore_X_Window win) static Ecore_Evas * _ecore_evas_x_match(Ecore_X_Window win) { - return evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win)); + Ecore_Evas *ee; + + ee = evas_hash_find(ecore_evases_hash, _ecore_evas_x_winid_str_get(win)); + if ((ee) && (ee->delete_idle_enterer)) return NULL; + return ee; } static void @@ -1500,7 +1506,7 @@ _ecore_evas_x_shutdown(void) { int i; - while (ecore_evases) ecore_evas_free(ecore_evases); + while (ecore_evases) _ecore_evas_free(ecore_evases); for (i = 0; i < 16; i++) ecore_event_handler_del(ecore_evas_event_handlers[i]); ecore_idle_enterer_del(ecore_evas_idle_enterer);