diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp index a672943fa4..19efa5dcb4 100644 --- a/src/common/logging/backend.cpp +++ b/src/common/logging/backend.cpp @@ -27,13 +27,13 @@ #include "common/common_paths.h" #include "common/file_util.h" #include "common/literals.h" -#include "common/settings.h" -#include "common/thread.h" #include "common/logging/backend.h" #include "common/logging/log.h" #include "common/logging/log_entry.h" #include "common/logging/text_formatter.h" +#include "common/settings.h" #include "common/string_util.h" +#include "common/thread.h" #include "common/threadsafe_queue.h" namespace Common::Log { diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h index 5584229a62..d69ab12891 100644 --- a/src/common/threadsafe_queue.h +++ b/src/common/threadsafe_queue.h @@ -13,8 +13,10 @@ #include #include +#include "common/polyfill_thread.h" + namespace Common { -template +template class SPSCQueue { public: SPSCQueue() { @@ -93,6 +95,19 @@ public: return t; } + T PopWait(std::stop_token stop_token) { + if (Empty()) { + std::unique_lock lock{cv_mutex}; + CondvarWait(cv, lock, stop_token, [this] { return !Empty(); }); + } + if (stop_token.stop_requested()) { + return T{}; + } + T t; + Pop(t); + return t; + } + // not thread-safe void Clear() { size.store(0); @@ -121,13 +136,13 @@ private: ElementPtr* read_ptr; std::atomic_size_t size{0}; std::mutex cv_mutex; - std::condition_variable cv; + std::conditional_t cv; }; // a simple thread-safe, // single reader, multiple writer queue -template +template class MPSCQueue { public: [[nodiscard]] std::size_t Size() const { @@ -160,13 +175,17 @@ public: return spsc_queue.PopWait(); } + T PopWait(std::stop_token stop_token) { + return spsc_queue.PopWait(stop_token); + } + // not thread-safe void Clear() { spsc_queue.Clear(); } private: - SPSCQueue spsc_queue; + SPSCQueue spsc_queue; std::mutex write_lock; }; } // namespace Common