From ae6fda8638d9abd2e02d8d4b57c8e5494e0847e3 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 24 Jun 2023 11:43:10 +0300 Subject: [PATCH] logging: Convert backend_thread into an std::jthread Was getting an unhandled `invalid_argument` [exception](https://en.cppreference.com/w/cpp/thread/thread/join) during shutdown on my linux machine. This removes the need for a `StopBackendThread` function entirely since `jthread` [automatically handles both checking if the thread is joinable and stopping the token before attempting to join](https://en.cppreference.com/w/cpp/thread/jthread/~jthread) in the case that `StartBackendThread` was never called. --- src/common/logging/backend.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index ad01c2437..d342ff466 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -265,7 +265,8 @@ private: if (sig <= 0) { abort(); } - StopBackendThread(); + backend_thread.request_stop(); + backend_thread.join(); const auto signal_entry = CreateEntry(Class::Log, Level::Critical, "?", 0, "?", fmt::vformat("Received signal {}", fmt::make_format_args(sig))); @@ -308,18 +309,17 @@ private: SleepForever(); } #endif - StopBackendThread(); } void StartBackendThread() { - backend_thread = std::thread([this] { + backend_thread = std::jthread([this](std::stop_token stop_token) { Common::SetCurrentThreadName("citra:Log"); Entry entry; const auto write_logs = [this, &entry]() { ForEachBackend([&entry](Backend& backend) { backend.Write(entry); }); }; - while (!stop.stop_requested()) { - entry = message_queue.PopWait(stop.get_token()); + while (!stop_token.stop_requested()) { + entry = message_queue.PopWait(stop_token); if (entry.filename != nullptr) { write_logs(); } @@ -333,11 +333,6 @@ private: }); } - void StopBackendThread() { - stop.request_stop(); - backend_thread.join(); - } - Entry CreateEntry(Class log_class, Level log_level, const char* filename, unsigned int line_nr, const char* function, std::string&& message) const { using std::chrono::duration_cast; @@ -402,8 +397,7 @@ private: ColorConsoleBackend color_console_backend{}; FileBackend file_backend; - std::stop_source stop; - std::thread backend_thread; + std::jthread backend_thread; MPSCQueue message_queue{}; std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};