fix valgrind reported problems.
authorGustavo Sverzut Barbieri <barbieri@gmail.com>
Fri, 13 Nov 2009 22:22:05 +0000 (22:22 +0000)
committerGustavo Sverzut Barbieri <barbieri@gmail.com>
Fri, 13 Nov 2009 22:22:05 +0000 (22:22 +0000)
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
src/lib/elm_box.c
src/lib/elm_genlist.c
src/lib/elm_image.c
src/lib/elm_map.c
src/lib/elm_photocam.c
src/lib/elm_table.c
src/lib/elm_toolbar.c

index f3068f5..bbb79b6 100644 (file)
@@ -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);
 }
 
index 796e8dc..ac78b04 100644 (file)
@@ -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);
 }
 
index 9fdc0a2..cbd3046 100644 (file)
@@ -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);
index 7b9f927..e1c0ecc 100644 (file)
@@ -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);
 
index 59414ff..82ffd74 100644 (file)
@@ -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);
index 3db1df5..1de627c 100644 (file)
@@ -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;
+     }
 }
 
 /**
index 4319d04..0bec8c2 100644 (file)
@@ -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);
 }
 
index 663c290..56eaced 100644 (file)
@@ -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);
      }
 }