From 5f309b5d9f9cb120ae1f9bde8c075dd0c4383f0d Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 29 Mar 2010 05:03:25 +0000 Subject: [PATCH] actually fix evas event cb leak for good. work ast smart desc leak. SVN revision: 47552 --- legacy/evas/src/lib/canvas/evas_callbacks.c | 12 +++++++++++- legacy/evas/src/lib/canvas/evas_main.c | 1 + legacy/evas/src/lib/canvas/evas_smart.c | 6 ++++-- legacy/evas/src/lib/include/evas_private.h | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_callbacks.c b/legacy/evas/src/lib/canvas/evas_callbacks.c index b3b61515ef..fb903144ca 100644 --- a/legacy/evas/src/lib/canvas/evas_callbacks.c +++ b/legacy/evas/src/lib/canvas/evas_callbacks.c @@ -19,7 +19,7 @@ evas_event_callback_list_post_free(Eina_Inlist **list) l = l->next; if (fn->delete_me) { - *list = eina_inlist_remove(*list, EINA_INLIST_GET(fn)); + *list = eina_inlist_remove(*list, EINA_INLIST_GET(fn)); free(fn); } } @@ -73,6 +73,16 @@ evas_object_event_callback_cleanup(Evas_Object *obj) obj->callbacks = NULL; } +void +evas_event_callback_all_del(Evas *e) +{ + Evas_Func_Node *fn; + + if (!e->callbacks) return; + EINA_INLIST_FOREACH(e->callbacks->callbacks, fn) + fn->delete_me = 1; +} + void evas_event_callback_cleanup(Evas *e) { diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index b53c72eb97..56cb652462 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -239,6 +239,7 @@ evas_free(Evas *e) evas_fonts_zero_free(e); + evas_event_callback_all_del(e); evas_event_callback_cleanup(e); if (e->engine.func) diff --git a/legacy/evas/src/lib/canvas/evas_smart.c b/legacy/evas/src/lib/canvas/evas_smart.c index a78e5564e9..dae37c3237 100644 --- a/legacy/evas/src/lib/canvas/evas_smart.c +++ b/legacy/evas/src/lib/canvas/evas_smart.c @@ -113,6 +113,7 @@ evas_smart_free(Evas_Smart *s) s->delete_me = 1; if (s->usage > 0) return; if (s->class_allocated) free((void *)s->smart_class); + free(s->callbacks.array); free(s); } @@ -340,7 +341,8 @@ evas_smart_cb_descriptions_resize(Evas_Smart_Cb_Description_Array *a, unsigned i static int _evas_smart_cb_description_cmp_sort(const void *p1, const void *p2) { - const Evas_Smart_Cb_Description * const*a = p1, * const*b = p2; + const Evas_Smart_Cb_Description **a = (const Evas_Smart_Cb_Description **)p1; + const Evas_Smart_Cb_Description **b = (const Evas_Smart_Cb_Description **)p2; return strcmp((*a)->name, (*b)->name); } @@ -415,7 +417,7 @@ static int _evas_smart_cb_description_cmp_search(const void *p1, const void *p2) { const char *name = p1; - const Evas_Smart_Cb_Description * const*v = p2; + const Evas_Smart_Cb_Description **v = (const Evas_Smart_Cb_Description **)p2; /* speed up string shares searches (same pointers) */ if (name == (*v)->name) return 0; return strcmp(name, (*v)->name); diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 4c7d722d8d..934258d988 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -792,6 +792,7 @@ void *evas_mem_calloc(int size); void evas_event_callback_list_post_free(Eina_Inlist **list); void evas_object_event_callback_all_del(Evas_Object *obj); void evas_object_event_callback_cleanup(Evas_Object *obj); +void evas_event_callback_all_del(Evas *e); void evas_event_callback_cleanup(Evas *e); void evas_object_inform_call_show(Evas_Object *obj); void evas_object_inform_call_hide(Evas_Object *obj);