hermet pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=ba596f2b0bdd7cf77d66bf75c290397c62121ee3

commit ba596f2b0bdd7cf77d66bf75c290397c62121ee3
Author: ChunEon Park <[email protected]>
Date:   Tue Feb 4 10:21:04 2014 +0900

    mapbuf - don't leave the dangling static map pointer that won't be freed.
    
    Some memory profiler tools regard this as the memory leak.
    it makes engineers waste time to check this. especially app developers.
---
 src/lib/elm_mapbuf.c        | 40 ++++++++++++++++++++--------------------
 src/lib/elm_widget_mapbuf.h |  1 +
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/src/lib/elm_mapbuf.c b/src/lib/elm_mapbuf.c
index 3aff346..29023f0 100644
--- a/src/lib/elm_mapbuf.c
+++ b/src/lib/elm_mapbuf.c
@@ -96,8 +96,6 @@ _configure(Evas_Object *obj)
    ELM_MAPBUF_DATA_GET(obj, sd);
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
 
-   static Evas_Map *m = NULL;
-
    if (!sd->content) return;
    if (sd->enabled && !evas_object_visible_get(obj)) return;
 
@@ -107,17 +105,18 @@ _configure(Evas_Object *obj)
 
    if (sd->enabled)
      {
-        if (!m) m = evas_map_new(4);
-        evas_map_util_points_populate_from_geometry(m, x, y, w, h, 0);
+        if (!sd->map) sd->map = evas_map_new(4);
+        evas_map_util_points_populate_from_geometry(sd->map, x, y, w, h, 0);
         for (i = 0; i < (int)(sizeof(sd->colors)/sizeof(sd->colors[0])); i++)
           {
-             evas_map_point_color_set(m, i, sd->colors[i].r, sd->colors[i].g,
-                                      sd->colors[i].b, sd->colors[i].a);
+             evas_map_point_color_set(sd->map, i, sd->colors[i].r,
+                                      sd->colors[i].g, sd->colors[i].b,
+                                      sd->colors[i].a);
           }
 
-        evas_map_smooth_set(m, sd->smooth);
-        evas_map_alpha_set(m, sd->alpha);
-        evas_object_map_set(sd->content, m);
+        evas_map_smooth_set(sd->map, sd->smooth);
+        evas_map_alpha_set(sd->map, sd->alpha);
+        evas_object_map_set(sd->content, sd->map);
         evas_object_map_enable_set(sd->content, EINA_TRUE);
      }
    else
@@ -276,6 +275,17 @@ _elm_mapbuf_smart_content_unset(Eo *obj, void *_pd, 
va_list *list)
 }
 
 static void
+_elm_mapbuf_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
+{
+   Elm_Mapbuf_Smart_Data *priv = _pd;
+
+   ELM_SAFE_FREE(priv->idler, ecore_idler_del);
+   ELM_SAFE_FREE(priv->map, evas_map_free);
+
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
+}
+
+static void
 _elm_mapbuf_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
 {
    Elm_Mapbuf_Smart_Data *priv = _pd;
@@ -325,16 +335,6 @@ _constructor(Eo *obj, void *_pd EINA_UNUSED, va_list *list 
EINA_UNUSED)
          evas_obj_type_set(MY_CLASS_NAME_LEGACY));
 }
 
-static void
-_destructor(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
-{
-   Elm_Mapbuf_Smart_Data *priv = _pd;
-
-   ELM_SAFE_FREE(priv->idler, ecore_idler_del);
-
-   eo_do_super(obj, MY_CLASS, eo_destructor());
-}
-
 EAPI void
 elm_mapbuf_enabled_set(Evas_Object *obj,
                        Eina_Bool enabled)
@@ -573,9 +573,9 @@ _class_constructor(Eo_Class *klass)
 {
    const Eo_Op_Func_Description func_desc[] = {
         EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_CONSTRUCTOR), _constructor),
-        EO_OP_FUNC(EO_BASE_ID(EO_BASE_SUB_ID_DESTRUCTOR), _destructor),
 
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), 
_elm_mapbuf_smart_add),
+        EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), 
_elm_mapbuf_smart_del),
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_RESIZE), 
_elm_mapbuf_smart_resize),
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MOVE), 
_elm_mapbuf_smart_move),
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_SHOW), 
_elm_mapbuf_smart_show),
diff --git a/src/lib/elm_widget_mapbuf.h b/src/lib/elm_widget_mapbuf.h
index 2ee9f04..f4adf22 100644
--- a/src/lib/elm_widget_mapbuf.h
+++ b/src/lib/elm_widget_mapbuf.h
@@ -23,6 +23,7 @@ struct _Elm_Mapbuf_Smart_Data
    Evas_Object          *self;
    Evas_Object          *content;
    Ecore_Idler          *idler;
+   Evas_Map             *map;
    struct
      {
         int r, g, b, a;

-- 


Reply via email to