X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d130fb8f06b7a6a6587589033f2d1d64c2daea4b..7ca53b5ebe9b96f24832b6890a34e13599b254c2:/src/xbt/log.cpp diff --git a/src/xbt/log.cpp b/src/xbt/log.cpp index ef3fd942cd..fd8afa045b 100644 --- a/src/xbt/log.cpp +++ b/src/xbt/log.cpp @@ -1,6 +1,6 @@ /* log - a generic logging facility in the spirit of log4j */ -/* Copyright (c) 2004-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2004-2021. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -13,8 +13,10 @@ #include "xbt/string.hpp" #include +#include #include #include +#include #include int xbt_log_no_loc = 0; /* if set to true (with --log=no_loc), file localization will be omitted (for tesh tests) */ @@ -36,18 +38,15 @@ struct xbt_log_setting_t { xbt_log_appender_t appender = nullptr; }; -static std::vector xbt_log_settings; - -const char *xbt_log_priority_names[8] = { - "NONE", - "TRACE", - "DEBUG", - "VERBOSE", - "INFO", - "WARNING", - "ERROR", - "CRITICAL" -}; +// This function is here to avoid static initialization order fiasco +static std::vector& xbt_log_settings() +{ + static std::vector value; + return value; +} + +constexpr std::array xbt_log_priority_names{ + {"NONE", "TRACE", "DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR", "CRITICAL"}}; s_xbt_log_category_t _XBT_LOGV(XBT_LOG_ROOT_CAT) = { nullptr /*parent */, @@ -76,8 +75,8 @@ void xbt_log_preinit(void) log_cat_init_mutex = new std::recursive_mutex(); } -static void xbt_log_help(void); -static void xbt_log_help_categories(void); +static void xbt_log_help(); +static void xbt_log_help_categories(); /** @brief Get all logging settings from the command line * @@ -158,31 +157,31 @@ void _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) const xbt_log_category_s* cat = ev->cat; xbt_assert(ev->priority >= 0, "Negative logging priority naturally forbidden"); - xbt_assert(static_cast(ev->priority) < sizeof(xbt_log_priority_names)/sizeof(xbt_log_priority_names[0]), + xbt_assert(static_cast(ev->priority) < xbt_log_priority_names.size(), "Priority %d is greater than the biggest allowed value", ev->priority); - while (1) { + while (true) { const s_xbt_log_appender_t* appender = cat->appender; if (appender != nullptr) { xbt_assert(cat->layout, "No valid layout for the appender of category %s", cat->name); /* First, try with a static buffer */ - int done = 0; - char buff[XBT_LOG_STATIC_BUFFER_SIZE]; - ev->buffer = buff; - ev->buffer_size = sizeof buff; + bool done = false; + std::array buff; + ev->buffer = buff.data(); + ev->buffer_size = buff.size(); va_start(ev->ap, fmt); done = cat->layout->do_layout(cat->layout, ev, fmt); va_end(ev->ap); - ev->buffer = nullptr; // Calm down, static analyzers, this pointer to local array wont leak out of the scope. + ev->buffer = nullptr; // Calm down, static analyzers, this pointer to local array won't leak out of the scope. if (done) { - appender->do_append(appender, buff); + appender->do_append(appender, buff.data()); } else { /* The static buffer was too small, use a dynamically expanded one */ ev->buffer_size = XBT_LOG_DYNAMIC_BUFFER_SIZE; ev->buffer = static_cast(xbt_malloc(ev->buffer_size)); - while (1) { + while (true) { va_start(ev->ap, fmt); done = cat->layout->do_layout(cat->layout, ev, fmt); va_end(ev->ap); @@ -249,6 +248,16 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, const xbt_log_se } } +/** Asserts that the provided name is unique */ +void _xbt_log_is_name_unique(const char* name, const char* file, int line) +{ + static std::unordered_set used_names; + + if (used_names.find(name) != used_names.end()) + XBT_WARN("%s:%d: log category redefined: %s", file, line, name); + used_names.insert(std::string(name)); +} + /* * This gets called the first time a category is referenced and performs the initialization. * Also resets threshold to inherited! @@ -256,6 +265,7 @@ static void _xbt_log_cat_apply_set(xbt_log_category_t category, const xbt_log_se int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority) { DISABLE_XBT_LOG_CAT_INIT(); + if (category->initialized) return priority >= category->threshold; @@ -293,11 +303,11 @@ int _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority } /* Apply the control */ - auto iset = std::find_if(begin(xbt_log_settings), end(xbt_log_settings), + auto iset = std::find_if(begin(xbt_log_settings()), end(xbt_log_settings()), [category](const xbt_log_setting_t& s) { return s.catname == category->name; }); - if (iset != xbt_log_settings.end()) { + if (iset != xbt_log_settings().end()) { _xbt_log_cat_apply_set(category, *iset); - xbt_log_settings.erase(iset); + xbt_log_settings().erase(iset); } else { XBT_DEBUG("Category '%s': inherited threshold = %s (=%d)", category->name, xbt_log_priority_names[category->threshold], category->threshold); @@ -437,18 +447,15 @@ static xbt_log_setting_t _xbt_log_parse_setting(const char *control_string) static xbt_log_category_t _xbt_log_cat_searchsub(xbt_log_category_t cat, const char* name) { - xbt_log_category_t child; - xbt_log_category_t res; - XBT_DEBUG("Search '%s' into '%s' (firstChild='%s'; nextSibling='%s')", name, cat->name, (cat->firstChild ? cat->firstChild->name : "none"), (cat->nextSibling ? cat->nextSibling->name : "none")); if (strcmp(cat->name, name) == 0) return cat; - for (child = cat->firstChild; child != nullptr; child = child->nextSibling) { + for (xbt_log_category_t child = cat->firstChild; child != nullptr; child = child->nextSibling) { XBT_DEBUG("Dig into %s", child->name); - res = _xbt_log_cat_searchsub(child, name); + xbt_log_category_t res = _xbt_log_cat_searchsub(child, name); if (res) return res; } @@ -510,7 +517,7 @@ void xbt_log_control_set(const char *control_string) } else { XBT_DEBUG("Store for further application"); XBT_DEBUG("push %p to the settings", &set); - xbt_log_settings.emplace_back(std::move(set)); + xbt_log_settings().emplace_back(std::move(set)); } } xbt_dynar_free(&set_strings); @@ -548,7 +555,7 @@ void xbt_log_additivity_set(xbt_log_category_t cat, int additivity) cat->additivity = additivity; } -static void xbt_log_help(void) +static void xbt_log_help() { XBT_HELP( "Description of the logging output:\n" @@ -640,7 +647,7 @@ static void xbt_log_help_categories_rec(xbt_log_category_t category, const std:: } } -static void xbt_log_help_categories(void) +static void xbt_log_help_categories() { XBT_HELP("Current log category hierarchy:"); xbt_log_help_categories_rec(&_XBT_LOGV(XBT_LOG_ROOT_CAT), " ");