X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/46c7981905414e7342d681be4f10709f8ef4009e..932b32f3ce5bb1d33aff7fa54faf1229ee68eb6d:/src/xbt/config.c diff --git a/src/xbt/config.c b/src/xbt/config.c index 0e532308ef..39b4262834 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -18,12 +18,6 @@ #include "xbt/peer.h" #include "xbt/config.h" /* prototypes of this module */ -#include "surf/surf_routing.h" /* COORD_HOST_LEVEL and COORD_ASR_LEVEL */ - -xbt_lib_t host_lib; -int COORD_HOST_LEVEL; //Coordinates level -xbt_lib_t as_router_lib; -int COORD_ASR_LEVEL; //Coordinates level XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support"); @@ -70,7 +64,7 @@ static xbt_cfgelm_t xbt_cfgelm_get(xbt_cfg_t cfg, const char *name, xbt_cfg_t xbt_cfg_new(void) { - return (xbt_cfg_t) xbt_dict_new(); + return (xbt_cfg_t) xbt_dict_new_homogeneous(&xbt_cfgelm_free); } /** \brief Copy an existing configuration set @@ -269,7 +263,7 @@ xbt_cfg_register(xbt_cfg_t * cfg, XBT_ERROR("%d is an invalide type code", type); } - xbt_dict_set((xbt_dict_t) * cfg, name, res, &xbt_cfgelm_free); + xbt_dict_set((xbt_dict_t) * cfg, name, res, NULL); } /** @brief Unregister an element from a config set. @@ -521,7 +515,8 @@ void xbt_cfg_set_vargs(xbt_cfg_t cfg, const char *name, va_list pa) TRY { type = xbt_cfg_get_type(cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); THROWF(not_found_error, 0, @@ -594,7 +589,7 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) double d; char *str; - xbt_cfgelm_t variable = NULL; + volatile xbt_cfgelm_t variable = NULL; char *optionlist_cpy; char *option, *name, *val; @@ -656,18 +651,6 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) } *(val++) = '\0'; - if (!strcmp(name,"coordinates")){ - if(!strcmp(val,"yes") && !COORD_HOST_LEVEL){ - XBT_INFO("Configuration change: Set '%s' to '%s'", name, val); - COORD_HOST_LEVEL = xbt_lib_add_level(host_lib,xbt_dynar_free_voidp); - COORD_ASR_LEVEL = xbt_lib_add_level(as_router_lib,xbt_dynar_free_voidp); - free(optionlist_cpy); - return; - } - if(strcmp(val,"yes")) - xbt_die("Setting CMD prop coordinates must be \"yes\""); - } - if (strncmp(name, "contexts/", strlen("contexts/"))) XBT_INFO("Configuration change: Set '%s' to '%s'", name, val); @@ -677,10 +660,17 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); - name = xbt_strdup(name); - free(optionlist_cpy); - THROWF(not_found_error, 0, - "No registered variable corresponding to '%s'.", name); + TRY { + THROWF(not_found_error, 0, + "No registered variable corresponding to '%s'.", name); + } + TRY_CLEANUP { + /* name points into optionlist_cpy, it cannot be freed before */ + free(optionlist_cpy); + } + CATCH_ANONYMOUS { + RETHROW; + } } free(optionlist_cpy); RETHROW; @@ -737,7 +727,7 @@ void xbt_cfg_set_parse(xbt_cfg_t cfg, const char *options) name); } } - CATCH(e) { + CATCH_ANONYMOUS { free(optionlist_cpy); RETHROW; } @@ -838,8 +828,8 @@ void xbt_cfg_set_int(xbt_cfg_t cfg, const char *name, int val) variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_int); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -854,7 +844,7 @@ void xbt_cfg_set_int(xbt_cfg_t cfg, const char *name, int val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -873,8 +863,8 @@ void xbt_cfg_set_double(xbt_cfg_t cfg, const char *name, double val) variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_double); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -888,7 +878,7 @@ void xbt_cfg_set_double(xbt_cfg_t cfg, const char *name, double val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -912,9 +902,9 @@ void xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val) xbt_cfgelm_type_name[variable->type], variable->type, variable); if (variable->max == 1) { - if (xbt_dynar_length(variable->content)) { + if (!xbt_dynar_is_empty(variable->content)) { if (variable->cb_rm) - (*variable->cb_rm) (name, 0); + variable->cb_rm(name, 0); else if (variable->type == xbt_cfgelm_string) { char *sval = xbt_dynar_get_as(variable->content, 0, char *); free(sval); @@ -933,7 +923,7 @@ void xbt_cfg_set_string(xbt_cfg_t cfg, const char *name, const char *val) } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -959,8 +949,8 @@ xbt_cfg_set_peer(xbt_cfg_t cfg, const char *name, const char *peer, variable = xbt_cfgelm_get(cfg, name, xbt_cfgelm_peer); if (variable->max == 1) { - if (variable->cb_rm && xbt_dynar_length(variable->content)) - (*variable->cb_rm) (name, 0); + if (variable->cb_rm && !xbt_dynar_is_empty(variable->content)) + variable->cb_rm(name, 0); xbt_dynar_set(variable->content, 0, &val); } else { @@ -974,7 +964,7 @@ xbt_cfg_set_peer(xbt_cfg_t cfg, const char *name, const char *peer, } if (variable->cb_set) - (*variable->cb_set) (name, xbt_dynar_length(variable->content) - 1); + variable->cb_set(name, xbt_dynar_length(variable->content) - 1); variable->isdefault = 0; } @@ -1003,7 +993,7 @@ void xbt_cfg_rm_int(xbt_cfg_t cfg, const char *name, int val) xbt_dynar_foreach(variable->content, cpt, seen) { if (seen == val) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1038,7 +1028,7 @@ void xbt_cfg_rm_double(xbt_cfg_t cfg, const char *name, double val) if (seen == val) { xbt_dynar_cursor_rm(variable->content, &cpt); if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); return; } } @@ -1070,7 +1060,7 @@ void xbt_cfg_rm_string(xbt_cfg_t cfg, const char *name, const char *val) xbt_dynar_foreach(variable->content, cpt, seen) { if (!strcpy(seen, val)) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1107,7 +1097,7 @@ xbt_cfg_rm_peer(xbt_cfg_t cfg, const char *name, const char *peer, xbt_dynar_foreach(variable->content, cpt, seen) { if (!strcpy(seen->name, peer) && seen->port == port) { if (variable->cb_rm) - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); xbt_dynar_cursor_rm(variable->content, &cpt); return; } @@ -1133,7 +1123,7 @@ void xbt_cfg_rm_at(xbt_cfg_t cfg, const char *name, int pos) pos, name, variable->min); if (variable->cb_rm) - (*variable->cb_rm) (name, pos); + variable->cb_rm(name, pos); xbt_dynar_remove_at(variable->content, pos, NULL); } @@ -1150,7 +1140,8 @@ void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) RETHROW; @@ -1165,7 +1156,7 @@ void xbt_cfg_empty(xbt_cfg_t cfg, const char *name) unsigned int cpt; void *ignored; xbt_dynar_foreach(variable->content, cpt, ignored) { - (*variable->cb_rm) (name, cpt); + variable->cb_rm(name, cpt); } } xbt_dynar_reset(variable->content); @@ -1254,7 +1245,7 @@ char *xbt_cfg_get_string(xbt_cfg_t cfg, const char *name) XBT_WARN ("You asked for the first value of the config element '%s', but there is %lu values\n", name, xbt_dynar_length(variable->content)); - } else if (xbt_dynar_length(variable->content) == 0) { + } else if (xbt_dynar_is_empty(variable->content)) { return NULL; } @@ -1311,7 +1302,8 @@ xbt_dynar_t xbt_cfg_get_dynar(xbt_cfg_t cfg, const char *name) TRY { variable = xbt_dict_get((xbt_dict_t) cfg, name); - } CATCH(e) { + } + CATCH(e) { if (e.category == not_found_error) { xbt_ex_free(e); THROWF(not_found_error, 0, @@ -1490,7 +1482,8 @@ XBT_TEST_UNIT("use", test_config_use, "Data retrieving tests") TRY { xbt_cfg_set_parse(myset, "color:blue"); - } CATCH(e) { + } + CATCH(e) { if (e.category != not_found_error) xbt_test_exception(e); xbt_ex_free(e);