From: Bluezery <ohpowel@gmail.com>

Subject: [E-devel] [patch] change plug-in loading behavior in elm_map

Elm_map have 3 modules (Tile, Route, Name) for plug-in loading
When elm_map is added, each 3 modules search plug-ins
(elm_map does use eina_module, not elm_module because elm_map loads
several modules. )

Previously, Each modules in elm_map search modules separately.
So module init /shutdown function in each plug-in is called 3times.
This can cause problems.
I fixed that module init is called at one time and module never be
unloaded (in process life-cycle).



SVN revision: 75974
This commit is contained in:
Bluezery 2012-09-03 08:35:53 +00:00 committed by Carsten Haitzler
parent 8926036ad2
commit f74bda827d
3 changed files with 177 additions and 301 deletions

View File

@ -10,6 +10,7 @@ Improvements:
* Multibutton entry entry is now an elm layout.
* Popup widget is now an elm layout.
* Panel widget is now an elm layout.
* Improve elm map module loading/searching efficiency.
Fixes:

View File

@ -3263,116 +3263,6 @@ _pinch_rotate_end_cb(void *data,
return EVAS_EVENT_FLAG_NONE;
}
static Eina_Bool
_source_tile_mod_cb(Eina_Module *m,
void *data)
{
Source_Tile *s;
const char *file;
Elm_Map_Smart_Data *sd = data;
Elm_Map_Module_Tile_Url_Func url_cb;
Elm_Map_Module_Source_Name_Func name_cb;
Elm_Map_Module_Tile_Scale_Func scale_cb;
Elm_Map_Module_Tile_Zoom_Min_Func zoom_min;
Elm_Map_Module_Tile_Zoom_Max_Func zoom_max;
Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord;
Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
file = eina_module_file_get(m);
if (!eina_module_load(m))
{
ERR("Could not load module \"%s\": %s", file,
eina_error_msg_get(eina_error_get()));
return EINA_FALSE;
}
name_cb = eina_module_symbol_get(m, "map_module_source_name_get");
zoom_min = eina_module_symbol_get(m, "map_module_tile_zoom_min_get");
zoom_max = eina_module_symbol_get(m, "map_module_tile_zoom_max_get");
url_cb = eina_module_symbol_get(m, "map_module_tile_url_get");
geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord");
coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo");
scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get");
if ((!name_cb) || (!zoom_min) || (!zoom_max) || (!url_cb) ||
(!geo_to_coord) || (!coord_to_geo) || (!scale_cb))
{
WRN("Could not find map module functions from module \"%s\": %s",
file, eina_error_msg_get(eina_error_get()));
eina_module_unload(m);
return EINA_FALSE;
}
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->zoom_min = zoom_min();
s->zoom_max = zoom_max();
s->url_cb = url_cb;
s->geo_to_coord = geo_to_coord;
s->coord_to_geo = coord_to_geo;
s->scale_cb = scale_cb;
sd->src_tiles = eina_list_append(sd->src_tiles, s);
return EINA_TRUE;
}
static void
_source_tile_load(Elm_Map_Smart_Data *sd)
{
unsigned int idx;
Source_Tile *s;
Eina_List *l;
// Load from hard coded data
for (idx = 0; idx < (sizeof(src_tiles) / sizeof(Source_Tile)); idx++)
{
s = ELM_NEW(Source_Tile);
s->name = src_tiles[idx].name;
s->zoom_min = src_tiles[idx].zoom_min;
s->zoom_max = src_tiles[idx].zoom_max;
s->url_cb = src_tiles[idx].url_cb;
s->geo_to_coord = src_tiles[idx].geo_to_coord;
s->coord_to_geo = src_tiles[idx].coord_to_geo;
s->scale_cb = src_tiles[idx].scale_cb;
sd->src_tiles = eina_list_append(sd->src_tiles, s);
}
// Load from modules
sd->src_tile_mods = eina_module_list_get(sd->src_tile_mods, MODULES_PATH, 1,
&_source_tile_mod_cb, sd);
// Set default source
sd->src_tile = eina_list_nth(sd->src_tiles, 0);
// Make name strings
idx = 0;
sd->src_tile_names =
calloc((eina_list_count(sd->src_tiles) + 1), sizeof(char *));
EINA_LIST_FOREACH (sd->src_tiles, l, s)
{
eina_stringshare_replace(&sd->src_tile_names[idx], s->name);
INF("source : %s", sd->src_tile_names[idx]);
idx++;
}
}
static void
_source_tile_unload(Elm_Map_Smart_Data *sd)
{
int idx = 0;
Source_Tile *s;
for (idx = 0; sd->src_tile_names[idx]; idx++)
eina_stringshare_del(sd->src_tile_names[idx]);
EINA_LIST_FREE (sd->src_tiles, s)
free(s);
eina_module_list_free(sd->src_tile_mods);
}
static void
_source_tile_set(Elm_Map_Smart_Data *sd,
const char *source_name)
@ -3414,96 +3304,6 @@ _source_tile_set(Elm_Map_Smart_Data *sd,
_zoom_do(sd, sd->zoom);
}
static Eina_Bool
_source_route_mod_cb(Eina_Module *m,
void *data)
{
Elm_Map_Module_Source_Name_Func name_cb;
Elm_Map_Module_Route_Url_Func url_cb;
Elm_Map_Smart_Data *sd = data;
const char *file;
Source_Route *s;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
file = eina_module_file_get(m);
if (!eina_module_load(m))
{
ERR("Could not load module \"%s\": %s", file,
eina_error_msg_get(eina_error_get()));
return EINA_FALSE;
}
name_cb = eina_module_symbol_get(m, "map_module_source_name_get");
url_cb = eina_module_symbol_get(m, "map_module_route_url_get");
if ((!name_cb) || (!url_cb))
{
WRN("Could not find map module functions from module \"%s\": %s",
file, eina_error_msg_get(eina_error_get()));
eina_module_unload(m);
return EINA_FALSE;
}
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->url_cb = url_cb;
sd->src_routes = eina_list_append(sd->src_routes, s);
eina_module_unload(m);
return EINA_TRUE;
}
static void
_source_route_load(Elm_Map_Smart_Data *sd)
{
Eina_List *l;
Source_Route *s;
unsigned int idx;
// Load from hard coded data
for (idx = 0; idx < (sizeof(src_routes) / sizeof(Source_Route)); idx++)
{
s = ELM_NEW(Source_Route);
s->name = src_routes[idx].name;
s->url_cb = src_routes[idx].url_cb;
sd->src_routes = eina_list_append(sd->src_routes, s);
}
// Load from modules
sd->src_route_mods = eina_module_list_get(sd->src_route_mods, MODULES_PATH,
1, &_source_route_mod_cb, sd);
// Set default source
sd->src_route = eina_list_nth(sd->src_routes, 0);
// Make name strings
idx = 0;
sd->src_route_names = calloc((eina_list_count(sd->src_routes) + 1),
sizeof(char *));
EINA_LIST_FOREACH (sd->src_routes, l, s)
{
eina_stringshare_replace(&sd->src_route_names[idx], s->name);
INF("source : %s", sd->src_route_names[idx]);
idx++;
}
}
static void
_source_route_unload(Elm_Map_Smart_Data *sd)
{
int idx = 0;
Source_Route *s;
for (idx = 0; sd->src_route_names[idx]; idx++)
eina_stringshare_del(sd->src_route_names[idx]);
EINA_LIST_FREE (sd->src_routes, s)
free(s);
eina_module_list_free(sd->src_route_mods);
}
static void
_source_route_set(Elm_Map_Smart_Data *sd,
const char *source_name)
@ -3531,96 +3331,6 @@ _source_route_set(Elm_Map_Smart_Data *sd,
}
}
static Eina_Bool
_source_name_mod_cb(Eina_Module *m,
void *data)
{
Elm_Map_Module_Source_Name_Func name_cb;
Elm_Map_Module_Name_Url_Func url_cb;
Elm_Map_Smart_Data *sd = data;
const char *file;
Source_Name *s;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
file = eina_module_file_get(m);
if (!eina_module_load(m))
{
ERR("Could not load module \"%s\": %s", file,
eina_error_msg_get(eina_error_get()));
return EINA_FALSE;
}
name_cb = eina_module_symbol_get(m, "map_module_source_name_get");
url_cb = eina_module_symbol_get(m, "map_module_name_url_get");
if ((!name_cb) || (!url_cb))
{
WRN("Could not find map module functions from module \"%s\": %s",
file, eina_error_msg_get(eina_error_get()));
eina_module_unload(m);
return EINA_FALSE;
}
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->url_cb = url_cb;
sd->src_names = eina_list_append(sd->src_names, s);
eina_module_unload(m);
return EINA_TRUE;
}
static void
_source_name_load(Elm_Map_Smart_Data *sd)
{
Eina_List *l;
Source_Name *s;
unsigned int idx;
// Load from hard coded data
for (idx = 0; idx < (sizeof(src_names) / sizeof(Source_Name)); idx++)
{
s = ELM_NEW(Source_Name);
s->name = src_names[idx].name;
s->url_cb = src_names[idx].url_cb;
sd->src_names = eina_list_append(sd->src_names, s);
}
// Load from modules
sd->src_name_mods = eina_module_list_get(sd->src_name_mods, MODULES_PATH, 1,
&_source_name_mod_cb, sd);
// Set default source
sd->src_name = eina_list_nth(sd->src_names, 0);
// Make name strings
idx = 0;
sd->src_name_names = calloc((eina_list_count(sd->src_names) + 1),
sizeof(char *));
EINA_LIST_FOREACH (sd->src_names, l, s)
{
eina_stringshare_replace(&sd->src_name_names[idx], s->name);
INF("source : %s", sd->src_name_names[idx]);
idx++;
}
}
static void
_source_name_unload(Elm_Map_Smart_Data *sd)
{
int idx = 0;
Source_Name *s;
for (idx = 0; sd->src_name_names[idx]; idx++)
eina_stringshare_del(sd->src_name_names[idx]);
EINA_LIST_FREE (sd->src_names, s)
free(s);
eina_module_list_free(sd->src_name_mods);
}
static void
_source_name_set(Elm_Map_Smart_Data *sd,
const char *source_name)
@ -3648,20 +3358,186 @@ _source_name_set(Elm_Map_Smart_Data *sd,
}
}
static void
_source_all_load(Elm_Map_Smart_Data *sd)
static Eina_Bool
_source_mod_cb(Eina_Module *m,
void *data)
{
_source_tile_load(sd);
_source_route_load(sd);
_source_name_load(sd);
const char *file;
Elm_Map_Smart_Data *sd = data;
Elm_Map_Module_Source_Name_Func name_cb;
Elm_Map_Module_Tile_Url_Func tile_url_cb;
Elm_Map_Module_Tile_Scale_Func scale_cb;
Elm_Map_Module_Tile_Zoom_Min_Func zoom_min;
Elm_Map_Module_Tile_Zoom_Max_Func zoom_max;
Elm_Map_Module_Tile_Geo_to_Coord_Func geo_to_coord;
Elm_Map_Module_Tile_Coord_to_Geo_Func coord_to_geo;
Elm_Map_Module_Route_Url_Func route_url_cb;
Elm_Map_Module_Name_Url_Func name_url_cb;
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
file = eina_module_file_get(m);
if (!eina_module_load(m))
{
ERR("Could not load module \"%s\": %s", file,
eina_error_msg_get(eina_error_get()));
return EINA_FALSE;
}
name_cb = eina_module_symbol_get(m, "map_module_source_name_get");
if ((!name_cb))
{
WRN("Could not find map module name from module \"%s\": %s",
file, eina_error_msg_get(eina_error_get()));
eina_module_unload(m);
return EINA_FALSE;
}
// Find TILE module
tile_url_cb = eina_module_symbol_get(m, "map_module_tile_url_get");
zoom_min = eina_module_symbol_get(m, "map_module_tile_zoom_min_get");
zoom_max = eina_module_symbol_get(m, "map_module_tile_zoom_max_get");
geo_to_coord = eina_module_symbol_get(m, "map_module_tile_geo_to_coord");
coord_to_geo = eina_module_symbol_get(m, "map_module_tile_coord_to_geo");
scale_cb = eina_module_symbol_get(m, "map_module_tile_scale_get");
if (tile_url_cb && zoom_min && zoom_max && geo_to_coord && coord_to_geo &&
scale_cb)
{
INF("Map TILE module is loaded \"%s\"", file);
Source_Tile *s;
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->url_cb = tile_url_cb;
s->zoom_min = zoom_min();
s->zoom_max = zoom_max();
s->geo_to_coord = geo_to_coord;
s->coord_to_geo = coord_to_geo;
s->scale_cb = scale_cb;
sd->src_tiles = eina_list_append(sd->src_tiles, s);
}
// Find ROUTE module
route_url_cb = eina_module_symbol_get(m, "map_module_route_url_get");
if (route_url_cb)
{
INF("Map ROUTE module is loaded \"%s\"", file);
Source_Route *s;
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->url_cb = route_url_cb;
sd->src_routes = eina_list_append(sd->src_routes, s);
}
// Find NAME module
name_url_cb = eina_module_symbol_get(m, "map_module_name_url_get");
if (name_url_cb)
{
INF("Map NAME module is loaded \"%s\"", file);
Source_Name *s;
s = ELM_NEW(Source_Tile);
s->name = name_cb();
s->url_cb = name_url_cb;
sd->src_names = eina_list_append(sd->src_names, s);
}
return EINA_TRUE;
}
static void
_source_all_unload(Elm_Map_Smart_Data *sd)
{
_source_tile_unload(sd);
_source_route_unload(sd);
_source_name_unload(sd);
int idx = 0;
Source_Tile *s;
for (idx = 0; sd->src_tile_names[idx]; idx++)
eina_stringshare_del(sd->src_tile_names[idx]);
for (idx = 0; sd->src_route_names[idx]; idx++)
eina_stringshare_del(sd->src_route_names[idx]);
for (idx = 0; sd->src_name_names[idx]; idx++)
eina_stringshare_del(sd->src_name_names[idx]);
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_module_list_free(sd->src_mods);
}
static void
_source_all_load(Elm_Map_Smart_Data *sd)
{
Source_Tile *src_tile;
Source_Route *src_route;
Source_Name *src_name;
unsigned int idx;
Eina_List *l;
// Load hard coded TILE source
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->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;
src_tile->geo_to_coord = src_tiles[idx].geo_to_coord;
src_tile->coord_to_geo = src_tiles[idx].coord_to_geo;
src_tile->scale_cb = src_tiles[idx].scale_cb;
sd->src_tiles = eina_list_append(sd->src_tiles, src_tile);
}
// Load hard coded ROUTE source
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->url_cb = src_routes[idx].url_cb;
sd->src_routes = eina_list_append(sd->src_routes, src_route);
}
// Load from hard coded NAME source
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->url_cb = src_names[idx].url_cb;
sd->src_names = eina_list_append(sd->src_names, src_name);
}
// Load from modules
sd->src_mods = eina_module_list_get(sd->src_mods, MODULES_PATH, 1,
&_source_mod_cb, sd);
// Set default source
sd->src_tile = eina_list_nth(sd->src_tiles, 0);
sd->src_route = eina_list_nth(sd->src_routes, 0);
sd->src_name = eina_list_nth(sd->src_names, 0);
// Make name string of sources
idx = 0;
sd->src_tile_names = calloc((eina_list_count(sd->src_tiles) + 1),
sizeof(const char *));
EINA_LIST_FOREACH (sd->src_tiles, l, src_tile)
{
eina_stringshare_replace(&sd->src_tile_names[idx], src_tile->name);
INF("source : %s", sd->src_tile_names[idx]);
idx++;
}
idx = 0;
sd->src_route_names = calloc((eina_list_count(sd->src_routes) + 1),
sizeof(const char *));
EINA_LIST_FOREACH (sd->src_routes, l, src_route)
{
eina_stringshare_replace(&sd->src_route_names[idx], src_route->name);
INF("source : %s", sd->src_route_names[idx]);
idx++;
}
idx = 0;
sd->src_name_names = calloc((eina_list_count(sd->src_names) + 1),
sizeof(const char *));
EINA_LIST_FOREACH (sd->src_names, l, src_name)
{
eina_stringshare_replace(&sd->src_name_names[idx], src_name->name);
INF("source : %s", sd->src_name_names[idx]);
idx++;
}
}
static void

View File

@ -485,17 +485,16 @@ struct _Elm_Map_Smart_Data
Evas_Object *sep_maps_overlays;
Evas_Map *map;
Eina_Array *src_tile_mods;
Eina_Array *src_mods;
Source_Tile *src_tile;
Eina_List *src_tiles;
const char **src_tile_names;
Eina_Array *src_route_mods;
Source_Route *src_route;
Eina_List *src_routes;
const char **src_route_names;
Eina_Array *src_name_mods;
Source_Name *src_name;
Eina_List *src_names;
const char **src_name_names;