X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/7a3a100990355eb757dc81106b5aac6daed0b8e1..3836e4e27a13a0d389812e41a4d5d651ff0c158b:/src/xbt/config.cpp diff --git a/src/xbt/config.cpp b/src/xbt/config.cpp index 5ca3c34908..0a5f2f3568 100644 --- a/src/xbt/config.cpp +++ b/src/xbt/config.cpp @@ -19,24 +19,22 @@ #include #include -#include -#include -#include +#include "simgrid/sg_config.hpp" +#include "xbt/dynar.h" +#include "xbt/log.h" #include "xbt/misc.h" #include "xbt/sysdep.h" -#include "xbt/log.h" -#include "xbt/dynar.h" +#include +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_cfg, xbt, "configuration support"); XBT_EXPORT_NO_IMPORT xbt_cfg_t simgrid_config = nullptr; -extern "C" XBT_PUBLIC void sg_config_finalize(); namespace simgrid { namespace config { -missing_key_error::~missing_key_error() = default; - namespace { const char* true_values[] = { @@ -216,6 +214,7 @@ public: { this->content = std::move(value); this->update(); + this->unsetDefault(); } void setDefaultValue(T value) @@ -263,7 +262,7 @@ private: bool warn_for_aliases = true; public: - Config() = default; + Config(); ~Config(); // No copy: @@ -297,6 +296,10 @@ protected: ConfigurationElement* getDictElement(const char* name); }; +Config::Config() +{ + atexit(&sg_config_finalize); +} Config::~Config() { XBT_DEBUG("Frees cfg set %p", this); @@ -317,7 +320,7 @@ inline ConfigurationElement* Config::getDictElement(const char* name) XBT_INFO("Option %s has been renamed to %s. Consider switching.", name, res->getKey().c_str()); return res; } else { - throw simgrid::config::missing_key_error(std::string("Bad config key: ") + name); + THROWF(not_found_error, 0, "Bad config key: %s", name); } } } @@ -389,9 +392,10 @@ template XBT_PUBLIC std::string const& getConfig(const char* name); // ***** alias ***** -void alias(const char* realname, const char* aliasname) +void alias(const char* realname, std::initializer_list aliases) { - simgrid_config->alias(realname, aliasname); + for (auto const& aliasname : aliases) + simgrid_config->alias(realname, aliasname); } // ***** declareFlag ***** @@ -399,10 +403,8 @@ void alias(const char* realname, const char* aliasname) template XBT_PUBLIC void declareFlag(const char* name, const char* description, T value, std::function callback) { - if (simgrid_config == nullptr) { + if (simgrid_config == nullptr) simgrid_config = xbt_cfg_new(); - atexit(sg_config_finalize); - } simgrid_config->registerOption( name, description, std::move(value), std::move(callback)); } @@ -420,7 +422,10 @@ template XBT_PUBLIC void declareFlag(const char* name, const char* description, // ***** C bindings ***** -xbt_cfg_t xbt_cfg_new() { return new simgrid::config::Config(); } +xbt_cfg_t xbt_cfg_new() +{ + return new simgrid::config::Config(); +} void xbt_cfg_free(xbt_cfg_t * cfg) { delete *cfg; } void xbt_cfg_dump(const char *name, const char *indent, xbt_cfg_t cfg) @@ -440,37 +445,29 @@ void xbt_cfg_register_double(const char *name, double default_value, void xbt_cfg_register_int(const char *name, int default_value,xbt_cfg_cb_t cb_set, const char *desc) { - if (simgrid_config == nullptr) { + if (simgrid_config == nullptr) simgrid_config = xbt_cfg_new(); - atexit(&sg_config_finalize); - } simgrid_config->registerOption(name, desc, default_value, cb_set); } void xbt_cfg_register_string(const char *name, const char *default_value, xbt_cfg_cb_t cb_set, const char *desc) { - if (simgrid_config == nullptr) { + if (simgrid_config == nullptr) simgrid_config = xbt_cfg_new(); - atexit(sg_config_finalize); - } simgrid_config->registerOption(name, desc, default_value ? default_value : "", cb_set); } void xbt_cfg_register_boolean(const char *name, const char*default_value,xbt_cfg_cb_t cb_set, const char *desc) { - if (simgrid_config == nullptr) { + if (simgrid_config == nullptr) simgrid_config = xbt_cfg_new(); - atexit(sg_config_finalize); - } simgrid_config->registerOption(name, desc, simgrid::config::parseBool(default_value), cb_set); } void xbt_cfg_register_alias(const char *realname, const char *aliasname) { - if (simgrid_config == nullptr) { + if (simgrid_config == nullptr) simgrid_config = xbt_cfg_new(); - atexit(sg_config_finalize); - } simgrid_config->alias(realname, aliasname); } @@ -521,31 +518,10 @@ void xbt_cfg_set_parse(const char *options) if (name.compare(0, path.length(), path) != 0) XBT_INFO("Configuration change: Set '%s' to '%s'", name.c_str(), val.c_str()); - try { - (*simgrid_config)[name.c_str()].setStringValue(val.c_str()); - } - catch (simgrid::config::missing_key_error& e) { - goto on_missing_key; - } - catch (...) { - goto on_exception; - } + (*simgrid_config)[name.c_str()].setStringValue(val.c_str()); } - return; - - /* Do not THROWF from a C++ exception catching context, or some cleanups will be missing */ -on_missing_key: - THROWF(not_found_error, 0, "Could not set variables %s", options); -on_exception: - THROWF(unknown_error, 0, "Could not set variables %s", options); } -// Horrible mess to translate C++ exceptions to C exceptions: -// Exit from the catch block (and do the correct exception cleaning) before attempting to THROWF. -#define TRANSLATE_EXCEPTIONS(...) \ - catch(simgrid::config::missing_key_error& e) { THROWF(not_found_error, 0, __VA_ARGS__); abort(); } \ - catch(...) { THROWF(not_found_error, 0, __VA_ARGS__); abort(); } - /** @brief Set the value of a variable, using the string representation of that value * * @param key name of the variable to modify @@ -554,11 +530,7 @@ on_exception: void xbt_cfg_set_as_string(const char *key, const char *value) { - try { - (*simgrid_config)[key].setStringValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s as string %s", key, value); + (*simgrid_config)[key].setStringValue(value); } /** @brief Set an integer value to \a name within \a cfg if it wasn't changed yet @@ -568,11 +540,7 @@ void xbt_cfg_set_as_string(const char *key, const char *value) */ void xbt_cfg_setdefault_int(const char *key, int value) { - try { - (*simgrid_config)[key].setDefaultValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to default integer %i", key, value); + (*simgrid_config)[key].setDefaultValue(value); } /** @brief Set an integer value to \a name within \a cfg if it wasn't changed yet @@ -582,11 +550,7 @@ void xbt_cfg_setdefault_int(const char *key, int value) */ void xbt_cfg_setdefault_double(const char *key, double value) { - try { - (*simgrid_config)[key].setDefaultValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to default double %f", key, value); + (*simgrid_config)[key].setDefaultValue(value); } /** @brief Set a string value to \a name within \a cfg if it wasn't changed yet @@ -596,11 +560,7 @@ void xbt_cfg_setdefault_double(const char *key, double value) */ void xbt_cfg_setdefault_string(const char *key, const char *value) { - try { - (*simgrid_config)[key].setDefaultValue(value ? value : ""); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to default string %s", key, value); + (*simgrid_config)[key].setDefaultValue(value ? value : ""); } /** @brief Set an boolean value to \a name within \a cfg if it wasn't changed yet @@ -610,11 +570,7 @@ void xbt_cfg_setdefault_string(const char *key, const char *value) */ void xbt_cfg_setdefault_boolean(const char *key, const char *value) { - try { - (*simgrid_config)[key].setDefaultValue(simgrid::config::parseBool(value)); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to default boolean %s", key, value); + (*simgrid_config)[key].setDefaultValue(simgrid::config::parseBool(value)); } /** @brief Set an integer value to \a name within \a cfg @@ -624,11 +580,7 @@ void xbt_cfg_setdefault_boolean(const char *key, const char *value) */ void xbt_cfg_set_int(const char *key, int value) { - try { - (*simgrid_config)[key].setValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to integer %i", key, value); + (*simgrid_config)[key].setValue(value); } /** @brief Set or add a double value to \a name within \a cfg @@ -638,11 +590,7 @@ void xbt_cfg_set_int(const char *key, int value) */ void xbt_cfg_set_double(const char *key, double value) { - try { - (*simgrid_config)[key].setValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to double %f", key, value); + (*simgrid_config)[key].setValue(value); } /** @brief Set or add a string value to \a name within \a cfg @@ -653,11 +601,7 @@ void xbt_cfg_set_double(const char *key, double value) */ void xbt_cfg_set_string(const char* key, const char* value) { - try { - (*simgrid_config)[key].setValue(value); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to string %s", key, value); + (*simgrid_config)[key].setValue(value); } /** @brief Set or add a boolean value to \a name within \a cfg @@ -667,21 +611,14 @@ void xbt_cfg_set_string(const char* key, const char* value) */ void xbt_cfg_set_boolean(const char *key, const char *value) { - try { - (*simgrid_config)[key].setValue(simgrid::config::parseBool(value)); - return; - } - TRANSLATE_EXCEPTIONS("Could not set variable %s to boolean %s", key, value); + (*simgrid_config)[key].setValue(simgrid::config::parseBool(value)); } /* Say if the value is the default value */ int xbt_cfg_is_default_value(const char *key) { - try { - return (*simgrid_config)[key].isDefault() ? 1 : 0; - } - TRANSLATE_EXCEPTIONS("Could not get variable %s", key); + return (*simgrid_config)[key].isDefault() ? 1 : 0; } /*----[ Getting ]---------------------------------------------------------*/ @@ -693,10 +630,7 @@ int xbt_cfg_is_default_value(const char *key) */ int xbt_cfg_get_int(const char *key) { - try { - return (*simgrid_config)[key].getValue(); - } - TRANSLATE_EXCEPTIONS("Could not get variable %s", key); + return (*simgrid_config)[key].getValue(); } /** @brief Retrieve a double value of a variable (get a warning if not uniq) @@ -707,10 +641,7 @@ int xbt_cfg_get_int(const char *key) */ double xbt_cfg_get_double(const char *key) { - try { - return (*simgrid_config)[key].getValue(); - } - TRANSLATE_EXCEPTIONS("Could not get variable %s", key); + return (*simgrid_config)[key].getValue(); } /** @brief Retrieve a string value of a variable (get a warning if not uniq) @@ -725,10 +656,7 @@ double xbt_cfg_get_double(const char *key) */ std::string xbt_cfg_get_string(const char* key) { - try { - return (*simgrid_config)[key].getValue(); - } - TRANSLATE_EXCEPTIONS("Could not get variable %s", key); + return (*simgrid_config)[key].getValue(); } /** @brief Retrieve a boolean value of a variable (get a warning if not uniq) @@ -740,10 +668,7 @@ std::string xbt_cfg_get_string(const char* key) */ int xbt_cfg_get_boolean(const char *key) { - try { - return (*simgrid_config)[key].getValue() ? 1 : 0; - } - TRANSLATE_EXCEPTIONS("Could not get variable %s", key); + return (*simgrid_config)[key].getValue() ? 1 : 0; } #ifdef SIMGRID_TEST