From f98bb725c4458d436d0e220307291297fabca279 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 13 Nov 2009 22:22:05 +0000 Subject: [PATCH] fix valgrind reported problems. GENERAL WARNING: do NOT delete sub-objects (elm_widget_sub_object_add) or resize object (elm_widget_resize_object_set) from del_hook()!! These are deleted automatically before this function is called, thus you might double free. Fixed all occurrences I've spotted with valgrind. Please do not add more :-) SVN revision: 43682 --- src/lib/elc_hoversel.c | 15 +++++++-------- src/lib/elm_box.c | 3 +-- src/lib/elm_genlist.c | 13 ++++++++++--- src/lib/elm_image.c | 11 ++++++++++- src/lib/elm_map.c | 20 ++++++++++++-------- src/lib/elm_photocam.c | 14 ++++++++++++-- src/lib/elm_table.c | 2 +- src/lib/elm_toolbar.c | 29 +++++++++++++++++------------ 8 files changed, 70 insertions(+), 37 deletions(-) diff --git a/src/lib/elc_hoversel.c b/src/lib/elc_hoversel.c index f3068f5..bbb79b6 100644 --- a/src/lib/elc_hoversel.c +++ b/src/lib/elc_hoversel.c @@ -50,18 +50,11 @@ static void _parent_del(void *data, Evas *e, Evas_Object *obj, void *event_info) static void _del_pre_hook(Evas_Object *obj) { - elm_hoversel_hover_end(obj); - elm_hoversel_hover_parent_set(obj, NULL); -} - -static void -_del_hook(Evas_Object *obj) -{ Elm_Hoversel_Item *it; Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; elm_hoversel_hover_end(obj); + elm_hoversel_hover_parent_set(obj, NULL); EINA_LIST_FREE(wd->items, it) { if (it->del_cb) it->del_cb((void *)it->data, it->obj, it); @@ -70,6 +63,12 @@ _del_hook(Evas_Object *obj) eina_stringshare_del(it->icon_group); free(it); } +} + +static void +_del_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); free(wd); } diff --git a/src/lib/elm_box.c b/src/lib/elm_box.c index 796e8dc..ac78b04 100644 --- a/src/lib/elm_box.c +++ b/src/lib/elm_box.c @@ -37,14 +37,13 @@ _del_pre_hook(Evas_Object *obj) evas_object_event_callback_del_full (wd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + evas_object_box_remove_all(wd->box, 0); } static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - evas_object_box_remove_all(wd->box, 0); - evas_object_del(wd->box); free(wd); } diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 9fdc0a2..cbd3046 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -335,15 +335,21 @@ _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - elm_genlist_clear(obj); - evas_object_del(wd->pan_smart); - wd->pan_smart = NULL; if (wd->calc_job) ecore_job_del(wd->calc_job); if (wd->update_job) ecore_job_del(wd->update_job); free(wd); } static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + evas_object_del(wd->pan_smart); + wd->pan_smart = NULL; + elm_genlist_clear(obj); +} + +static void _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); @@ -1274,6 +1280,7 @@ elm_genlist_add(Evas_Object *parent) elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_theme_hook_set(obj, _theme_hook); wd->scr = elm_smart_scroller_add(e); diff --git a/src/lib/elm_image.c b/src/lib/elm_image.c index 7b9f927..e1c0ecc 100644 --- a/src/lib/elm_image.c +++ b/src/lib/elm_image.c @@ -41,11 +41,19 @@ _del_hook(Evas_Object *obj) Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - evas_object_del(wd->img); free(wd); } static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + + if (!wd) return; + evas_object_del(wd->img); +} + +static void _theme_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); @@ -115,6 +123,7 @@ elm_image_add(Evas_Object *parent) elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_theme_hook_set(obj, _theme_hook); elm_widget_can_focus_set(obj, 0); diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c index 59414ff..82ffd74 100644 --- a/src/lib/elm_map.c +++ b/src/lib/elm_map.c @@ -664,18 +664,12 @@ _mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info) wd->on_hold = EINA_FALSE; } -static Evas_Smart_Class _pan_sc = {NULL}; +static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_NULL; - static void +static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - Grid *g; - - grid_clearall(obj); - evas_object_del(wd->pan_smart); - evas_object_del(wd->rect); - wd->pan_smart = NULL; if (wd->calc_job) ecore_job_del(wd->calc_job); if (wd->scr_timer) ecore_timer_del(wd->scr_timer); if (wd->zoom_animator) ecore_animator_del(wd->zoom_animator); @@ -683,6 +677,15 @@ _del_hook(Evas_Object *obj) free(wd); } +static void +_del_pre_hook(Evas_Object *obj) +{ + Widget_Data *wd = elm_widget_data_get(obj); + grid_clearall(obj); + evas_object_del(wd->pan_smart); + wd->pan_smart = NULL; +} + static void _theme_hook(Evas_Object *obj) { @@ -933,6 +936,7 @@ elm_map_add(Evas_Object *parent) elm_widget_sub_object_add(parent, obj); elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); + elm_widget_del_pre_hook_set(obj, _del_pre_hook); elm_widget_theme_hook_set(obj, _theme_hook); wd->scr = elm_smart_scroller_add(e); diff --git a/src/lib/elm_photocam.c b/src/lib/elm_photocam.c index 3db1df5..1de627c 100644 --- a/src/lib/elm_photocam.c +++ b/src/lib/elm_photocam.c @@ -656,7 +656,7 @@ _mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event_info) wd->on_hold = EINA_FALSE; } -static Evas_Smart_Class _pan_sc = {NULL}; +static Evas_Smart_Class _pan_sc = EVAS_SMART_CLASS_INIT_NULL; static void _del_hook(Evas_Object *obj) @@ -1394,6 +1394,12 @@ elm_photocam_region_get(Evas_Object *obj, int *x, int *y, int *w, int *h) else if (*w < 0) *w = 0; } } + else + { + if (x) *x = 0; + if (w) *w = 0; + } + if (wd->size.h > 0) { if (y) @@ -1409,7 +1415,11 @@ elm_photocam_region_get(Evas_Object *obj, int *x, int *y, int *w, int *h) else if (*h < 0) *h = 0; } } - wd->size.w; + else + { + if (y) *y = 0; + if (h) *h = 0; + } } /** diff --git a/src/lib/elm_table.c b/src/lib/elm_table.c index 4319d04..0bec8c2 100644 --- a/src/lib/elm_table.c +++ b/src/lib/elm_table.c @@ -28,13 +28,13 @@ _del_pre_hook(Evas_Object *obj) evas_object_event_callback_del_full (wd->tbl, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints, obj); + evas_object_del(wd->tbl); } static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - evas_object_del(wd->tbl); free(wd); } diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c index 663c290..56eaced 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -101,6 +101,14 @@ _menu_hide(void *data, Evas *e, Evas_Object *obj, void *event_info) } static void +_menu_del(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + // avoid hide being emitted during object deletion + evas_object_event_callback_del_full + (obj, EVAS_CALLBACK_HIDE, _menu_hide, data); +} + +static void _menu_move_resize(void *data, Evas *e, Evas_Object *obj, void *event_info) { Elm_Toolbar_Item *it = data; @@ -134,24 +142,21 @@ _del_pre_hook(Evas_Object *obj) if (!wd) return; EINA_LIST_FREE(wd->items, it) - elm_toolbar_item_menu_set(it, 0); + { + eina_stringshare_del(it->label); + if (it->icon) evas_object_del(it->icon); + if ((!wd->menu_parent) && (it->o_menu)) evas_object_del(it->o_menu); + evas_object_del(it->base); + free(it); + } } static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); - Elm_Toolbar_Item *it; if (!wd) return; - EINA_LIST_FREE(wd->items, it) - { - eina_stringshare_del(it->label); - if (it->icon) evas_object_del(it->icon); - evas_object_del(it->base); - free(it); - elm_toolbar_item_menu_set(it, 0); - } free(wd); } @@ -562,11 +567,11 @@ elm_toolbar_item_menu_set(Elm_Toolbar_Item *item, Eina_Bool menu) elm_menu_parent_set(item->o_menu, wd->menu_parent); evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_HIDE, _menu_hide, item); + evas_object_event_callback_add(item->o_menu, EVAS_CALLBACK_DEL, + _menu_del, item); } else if (item->o_menu) { - evas_object_event_callback_del_full(item->o_menu, EVAS_CALLBACK_HIDE, - _menu_hide, item); evas_object_del(item->o_menu); } } -- 2.7.4