Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use #include <...> for foreign header files.
[simgrid.git] / src / xbt / log.cpp
index 88726a9..d21ea0e 100644 (file)
@@ -8,7 +8,6 @@
 #include "src/xbt/log_private.hpp"
 #include "xbt/string.hpp"
 #include "xbt/sysdep.h"
-#include "xbt/xbt_modinter.h"
 
 #include <algorithm>
 #include <array>
@@ -56,6 +55,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(log, xbt, "Loggings from the logging mechanism i
 
 static void xbt_log_help();
 static void xbt_log_help_categories();
+static void xbt_log_postexit();
 
 void xbt_log_init(int *argc, char **argv)
 {
@@ -64,6 +64,7 @@ void xbt_log_init(int *argc, char **argv)
   int parse_args          = 1; // Stop parsing the parameters once we found '--'
 
   xbt_log_control_set("xbt_help.app:stdout xbt_help.threshold:VERBOSE xbt_help.fmt:%m%n");
+  atexit(xbt_log_postexit);
 
   /* Set logs and init log submodule */
   for (int i = 1; i < *argc; i++) {
@@ -97,24 +98,27 @@ void xbt_log_init(int *argc, char **argv)
   }
 }
 
-static void log_cat_exit(const s_xbt_log_category_t* cat)
+static void log_cat_exit(xbt_log_category_t cat)
 {
   if (cat->appender) {
     if (cat->appender->free_)
       cat->appender->free_(cat->appender);
     xbt_free(cat->appender);
+    cat->appender = nullptr;
   }
   if (cat->layout) {
     if (cat->layout->free_)
       cat->layout->free_(cat->layout);
     xbt_free(cat->layout);
+    cat->layout = nullptr;
   }
 
-  for (auto const* child = cat->firstChild; child != nullptr; child = child->nextSibling)
+  for (auto* child = cat->firstChild; child != nullptr; child = child->nextSibling)
     log_cat_exit(child);
+  cat->firstChild = nullptr;
 }
 
-void xbt_log_postexit(void)
+static void xbt_log_postexit(void)
 {
   XBT_VERB("Exiting log");
   log_cat_exit(&_XBT_LOGV(XBT_LOG_ROOT_CAT));
@@ -231,7 +235,7 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority
     return priority >= category->threshold;
 
   static std::recursive_mutex log_cat_init_mutex;
-  log_cat_init_mutex.lock();
+  const std::scoped_lock lock(log_cat_init_mutex);
 
   XBT_DEBUG("Initializing category '%s' (firstChild=%s, nextSibling=%s)", category->name,
          (category->firstChild ? category->firstChild->name : "none"),
@@ -275,7 +279,6 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority
   }
 
   category->initialized = 1;
-  log_cat_init_mutex.unlock();
   return priority >= category->threshold;
 }