raster pushed a commit to branch master.

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

commit 42a8a124efe5fee3dd98c4ad7f2c123df399c603
Author: wonguk.jeong <[email protected]>
Date:   Fri Apr 4 11:47:39 2014 +0900

    map: remove memory leak
    
    Summary:
    1. Name of sources from external module was not free'd. (there was type 
mismatch between external module and internal impl.)
    2. after eina_module_list_free(), eina_array_free() was not invoked.
    3. alloc'd but not free'd
    
    @fix
    
    Test Plan: valgrind
    
    Reviewers: raster, cedric, seoz, bluezery, woohyun
    
    CC: seoz
    
    Differential Revision: https://phab.enlightenment.org/D661
---
 src/lib/elm_map.c          | 30 ++++++++++++++++++++++++------
 src/lib/elm_widget_map.h   |  8 ++++----
 src/modules/test_map/mod.c |  4 ++--
 3 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c
index d0fe739..33e983b 100644
--- a/src/lib/elm_map.c
+++ b/src/lib/elm_map.c
@@ -3446,16 +3446,34 @@ _source_all_unload(Elm_Map_Data *sd)
 
    for (idx = 0; sd->src_tile_names[idx]; idx++)
      eina_stringshare_del(sd->src_tile_names[idx]);
+   free(sd->src_tile_names);
+
    for (idx = 0; sd->src_route_names[idx]; idx++)
      eina_stringshare_del(sd->src_route_names[idx]);
+   free(sd->src_route_names);
+
    for (idx = 0; sd->src_name_names[idx]; idx++)
      eina_stringshare_del(sd->src_name_names[idx]);
+   free(sd->src_name_names);
 
-   EINA_LIST_FREE(sd->src_tiles, s) free(s);
-   EINA_LIST_FREE(sd->src_routes, s) free(s);
-   EINA_LIST_FREE(sd->src_names, s) free(s);
+   EINA_LIST_FREE(sd->src_tiles, s)
+     {
+        eina_stringshare_del(s->name);
+        free(s);
+     }
+   EINA_LIST_FREE(sd->src_routes, s)
+     {
+        eina_stringshare_del(s->name);
+        free(s);
+     }
+   EINA_LIST_FREE(sd->src_names, s)
+     {
+        eina_stringshare_del(s->name);
+        free(s);
+     }
 
    eina_module_list_free(sd->src_mods);
+   eina_array_free(sd->src_mods);
 }
 
 static void
@@ -3471,7 +3489,7 @@ _source_all_load(Elm_Map_Data *sd)
    for (idx = 0; idx < (sizeof(src_tiles) / sizeof(Source_Tile)); idx++)
      {
         src_tile = ELM_NEW(Source_Tile);
-        src_tile->name = src_tiles[idx].name;
+        src_tile->name = eina_stringshare_add(src_tiles[idx].name);
         src_tile->zoom_min = src_tiles[idx].zoom_min;
         src_tile->zoom_max = src_tiles[idx].zoom_max;
         src_tile->url_cb = src_tiles[idx].url_cb;
@@ -3484,7 +3502,7 @@ _source_all_load(Elm_Map_Data *sd)
    for (idx = 0; idx < (sizeof(src_routes) / sizeof(Source_Route)); idx++)
      {
         src_route = ELM_NEW(Source_Route);
-        src_route->name = src_routes[idx].name;
+        src_route->name = eina_stringshare_add(src_routes[idx].name);
         src_route->url_cb = src_routes[idx].url_cb;
         sd->src_routes = eina_list_append(sd->src_routes, src_route);
      }
@@ -3492,7 +3510,7 @@ _source_all_load(Elm_Map_Data *sd)
    for (idx = 0; idx < (sizeof(src_names) / sizeof(Source_Name)); idx++)
      {
         src_name = ELM_NEW(Source_Name);
-        src_name->name = src_names[idx].name;
+        src_name->name = eina_stringshare_add(src_names[idx].name);
         src_name->url_cb = src_names[idx].url_cb;
         sd->src_names = eina_list_append(sd->src_names, src_name);
      }
diff --git a/src/lib/elm_widget_map.h b/src/lib/elm_widget_map.h
index d94db3a..1e2f054 100644
--- a/src/lib/elm_widget_map.h
+++ b/src/lib/elm_widget_map.h
@@ -20,7 +20,7 @@
 typedef struct _Elm_Map_Data     Elm_Map_Data;
 
 typedef struct _Elm_Map_Name_List      Elm_Map_Name_List;
-typedef char *(*Elm_Map_Module_Source_Name_Func)(void);
+typedef Eina_Stringshare *(*Elm_Map_Module_Source_Name_Func)(void);
 typedef int   (*Elm_Map_Module_Tile_Zoom_Min_Func)(void);
 typedef int   (*Elm_Map_Module_Tile_Zoom_Max_Func)(void);
 typedef char *(*Elm_Map_Module_Tile_Url_Func)(const Evas_Object *,
@@ -63,7 +63,7 @@ typedef struct _Source_Tile            Source_Tile;
 // and the map size is pow(2.0, z) * (tile size)
 struct _Source_Tile
 {
-   const char                           *name;
+   Eina_Stringshare                     *name;
    int                                   zoom_min;
    int                                   zoom_max;
    Elm_Map_Module_Tile_Url_Func          url_cb;
@@ -75,14 +75,14 @@ struct _Source_Tile
 typedef struct _Source_Route           Source_Route;
 struct _Source_Route
 {
-   const char                   *name;
+   Eina_Stringshare             *name;
    Elm_Map_Module_Route_Url_Func url_cb;
 };
 
 typedef struct _Source_Name            Source_Name;
 struct _Source_Name
 {
-   const char                  *name;
+   Eina_Stringshare            *name;
    Elm_Map_Module_Name_Url_Func url_cb;
 };
 
diff --git a/src/modules/test_map/mod.c b/src/modules/test_map/mod.c
index 452fd05..7699390 100644
--- a/src/modules/test_map/mod.c
+++ b/src/modules/test_map/mod.c
@@ -5,10 +5,10 @@
 #include "Elementary.h"
 #include <Eina.h>
 
-EAPI char *
+EAPI Eina_Stringshare *
 map_module_source_name_get(void)
 {
-   return strdup("test_map");
+   return eina_stringshare_add("test_map");
 }
 
 EAPI int

-- 


Reply via email to