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 --
