From b045b4026e991abfad8668bd38768e8a25c4e19e Mon Sep 17 00:00:00 2001 From: Florian Fischer <florian.fl.fischer@fau.de> Date: Mon, 14 Sep 2020 18:49:26 +0200 Subject: [PATCH] make log() thread-safe by dropping the log level map Concurrently using the CLOG_CONFIG map can result in a segmentation fault. To prevent concurrent access to LOG_CONFIG a new constexpr getLevelFor is introduces analogue to getTagFor. --- emper/Debug.hpp | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/emper/Debug.hpp b/emper/Debug.hpp index dca6fe1c..033122a8 100644 --- a/emper/Debug.hpp +++ b/emper/Debug.hpp @@ -60,21 +60,33 @@ enum LogLevel { void worker_log(const std::string& prefix, const std::string& message); -static const std::map<LogSubsystem, LogLevel> LOG_CONFIG = { - { LogSubsystem::PS, ALL }, - { LogSubsystem::F, ALL }, - { LogSubsystem::C, ALL }, - { LogSubsystem::CM, ALL }, - { LogSubsystem::DISP, ALL }, - { LogSubsystem::SCHED, ALL }, - { LogSubsystem::RUNTI, ALL }, - { LogSubsystem::U_B_MPSC_Q, ALL }, -}; - template <LogSubsystem logSubsystem> class Logger { private: + static constexpr LogLevel getLevelFor(LogSubsystem system) { + switch (system) { + case LogSubsystem::PS: + return ALL; + case LogSubsystem::F: + return ALL; + case LogSubsystem::C: + return ALL; + case LogSubsystem::CM: + return ALL; + case LogSubsystem::DISP: + return ALL; + case LogSubsystem::SCHED: + return ALL; + case LogSubsystem::RUNTI: + return ALL; + case LogSubsystem::U_B_MPSC_Q: + return ALL; + default: + return ALL; + } + } + static constexpr char const * getTagFor(LogSubsystem system) { switch (system) { case LogSubsystem::PS: @@ -115,7 +127,7 @@ protected: // Do not log any debug messages if NDEBUG is defined. if (level >= Debug) return; #endif - if (level > LOG_CONFIG.at(logSubsystem)) return; + if (level > getLevelFor(logSubsystem)) return; std::string subSystemTag = getTagFor(logSubsystem);; -- GitLab