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