Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
destroy the config set each time we allocate it
[simgrid.git] / src / xbt / config.cpp
index 6fc4d00..814ec46 100644 (file)
@@ -15,6 +15,7 @@
 #include <typeinfo>
 #include <type_traits>
 
+#include <xbt/ex.hpp>
 #include <xbt/config.h>
 #include <xbt/config.hpp>
 #include "xbt/misc.h"
 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() noexcept {}
+missing_key_error::~missing_key_error() {}
 
 class Config;
 
@@ -447,8 +451,10 @@ template<class T>
 XBT_PUBLIC(void) declareFlag(const char* name, const char* description,
   T value, std::function<void(const T&)> callback)
 {
-  if (simgrid_config == nullptr)
+  if (simgrid_config == nullptr) {
     simgrid_config = xbt_cfg_new();
+    atexit(sg_config_finalize);
+  }
   simgrid_config->registerOption<T>(
     name, description, std::move(value), std::move(callback));
 }
@@ -467,7 +473,7 @@ template XBT_PUBLIC(void) declareFlag(const char* name,
 
 // ***** C bindings *****
 
-xbt_cfg_t xbt_cfg_new(void)        { 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)
@@ -487,35 +493,43 @@ 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<int>(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<std::string>(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<bool>(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);
 }
 
-void xbt_cfg_aliases(void) { simgrid_config->showAliases(); }
-void xbt_cfg_help(void)    { simgrid_config->help(); }
+void xbt_cfg_aliases() { simgrid_config->showAliases(); }
+void xbt_cfg_help()    { simgrid_config->help(); }
 
 /*----[ Setting ]---------------------------------------------------------*/
 
@@ -605,10 +619,8 @@ on_exception:
 // Exit from the catch blog (and do the correct exceptio cleaning)
 // before attempting to THROWF.
 #define TRANSLATE_EXCEPTIONS(...) \
-  catch(simgrid::config::missing_key_error& e) { goto on_exception; } \
-  catch(...) { goto on_missing_key; } \
-  on_missing_key: THROWF(not_found_error, 0, __VA_ARGS__); \
-  on_exception: THROWF(not_found_error, 0, __VA_ARGS__);
+  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
  *
@@ -824,6 +836,7 @@ int xbt_cfg_get_boolean(const char *key)
 
 #include "xbt.h"
 #include "xbt/ex.h"
+#include <xbt/ex.hpp>
 
 #include <xbt/config.hpp>
 
@@ -869,14 +882,11 @@ XBT_TEST_UNIT("use", test_config_use, "Data retrieving tests")
 
   xbt_test_add("Access to a non-existant entry");
   {
-    xbt_ex_t e;
-
-    TRY {
+    try {
       xbt_cfg_set_parse("color:blue");
-    } CATCH(e) {
+    } catch(xbt_ex& e) {
       if (e.category != not_found_error)
         xbt_test_exception(e);
-      xbt_ex_free(e);
     }
   }
   xbt_cfg_free(&simgrid_config);