From f8a24cc1283d98fae8c051151bd4d5d9846ca47b Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 24 Aug 2016 14:25:06 -1000 Subject: [PATCH] Add logvisor::LockLog() for ensuring output stream sync --- include/logvisor/logvisor.hpp | 16 ++++++++++++++++ lib/logvisor.cpp | 1 + 2 files changed, 17 insertions(+) diff --git a/include/logvisor/logvisor.hpp b/include/logvisor/logvisor.hpp index 7e5e574..dca373e 100644 --- a/include/logvisor/logvisor.hpp +++ b/include/logvisor/logvisor.hpp @@ -8,6 +8,7 @@ #include #include #include +#include extern "C" void logvisorBp(); @@ -79,6 +80,19 @@ extern std::atomic_size_t ErrorCount; */ extern std::atomic_uint_fast64_t FrameIndex; +/** + * @brief Centralized logging lock + * + * Ensures logging streams aren't written concurrently + */ +extern std::mutex 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};} + /** * @brief Restore centralized logger vector to default state (silent operation) */ @@ -145,6 +159,7 @@ public: template inline void report(Level severity, const CharType* format, va_list ap) { + auto lk = LockLog(); for (auto& logger : MainLoggers) { va_list apc; @@ -179,6 +194,7 @@ public: template inline void reportSource(Level severity, const char* file, unsigned linenum, const CharType* format, va_list ap) { + auto lk = LockLog(); for (auto& logger : MainLoggers) { va_list apc; diff --git a/lib/logvisor.cpp b/lib/logvisor.cpp index cf02fea..a4699e2 100644 --- a/lib/logvisor.cpp +++ b/lib/logvisor.cpp @@ -73,6 +73,7 @@ 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::mutex LogMutex; static inline int ConsoleWidth() {