From e6f24e64284fff5d5559b3d7e5aa44b610e2d7e9 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 18 Jan 2017 10:54:00 -1000 Subject: [PATCH] Better regulation of logging mutex --- include/logvisor/logvisor.hpp | 19 +++++++++++++++++-- lib/logvisor.cpp | 4 +++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/logvisor/logvisor.hpp b/include/logvisor/logvisor.hpp index c4236f3..2355366 100644 --- a/include/logvisor/logvisor.hpp +++ b/include/logvisor/logvisor.hpp @@ -87,14 +87,29 @@ extern std::atomic_uint_fast64_t FrameIndex; * * Ensures logging streams aren't written concurrently */ -extern std::recursive_mutex LogMutex; +struct LogMutex +{ + bool enabled = true; + std::recursive_mutex mutex; + ~LogMutex() { enabled = false; } + std::unique_lock lock() + { + if (enabled) + return std::unique_lock(mutex); + else + return std::unique_lock(); + } +}; +extern LogMutex _LogMutex; /** * @brief Take a centralized lock for the logging output stream(s) * @return RAII mutex lock */ static inline std::unique_lock LockLog() -{return std::unique_lock{LogMutex};} +{ + return _LogMutex.lock(); +} /** * @brief Restore centralized logger vector to default state (silent operation) diff --git a/lib/logvisor.cpp b/lib/logvisor.cpp index 202d053..6b892af 100644 --- a/lib/logvisor.cpp +++ b/lib/logvisor.cpp @@ -193,8 +193,11 @@ void logvisorAbort() #endif +LogMutex _LogMutex; + static void AbortHandler(int signum) { + _LogMutex.enabled = false; switch (signum) { case SIGSEGV: @@ -217,7 +220,6 @@ static std::chrono::steady_clock::time_point GlobalStart = MonoClock.now(); static inline std::chrono::steady_clock::duration CurrentUptime() {return MonoClock.now() - GlobalStart;} std::atomic_uint_fast64_t FrameIndex(0); -std::recursive_mutex LogMutex; static inline int ConsoleWidth() {