diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h index 68955d66d..e10baed2e 100644 --- a/src/common/threadsafe_queue.h +++ b/src/common/threadsafe_queue.h @@ -7,18 +7,17 @@ // a simple lockless thread-safe, // single reader, single writer queue -#include #include #include #include #include -#include "common/common_types.h" +#include namespace Common { -template +template class SPSCQueue { public: - SPSCQueue() : size(0) { + SPSCQueue() { write_ptr = read_ptr = new ElementPtr(); } ~SPSCQueue() { @@ -26,13 +25,12 @@ public: delete read_ptr; } - u32 Size() const { - static_assert(NeedSize, "using Size() on FifoQueue without NeedSize"); + std::size_t Size() const { return size.load(); } bool Empty() const { - return !read_ptr->next.load(); + return Size() == 0; } T& Front() const { @@ -48,14 +46,14 @@ public: ElementPtr* new_ptr = new ElementPtr(); write_ptr->next.store(new_ptr, std::memory_order_release); write_ptr = new_ptr; - if (NeedSize) - size++; + ++size; + cv.notify_one(); } void Pop() { - if (NeedSize) - size--; + --size; + ElementPtr* tmpptr = read_ptr; // advance the read pointer read_ptr = tmpptr->next.load(); @@ -68,8 +66,7 @@ public: if (Empty()) return false; - if (NeedSize) - size--; + --size; ElementPtr* tmpptr = read_ptr; read_ptr = tmpptr->next.load(std::memory_order_acquire); @@ -101,7 +98,7 @@ private: // and a pointer to the next ElementPtr class ElementPtr { public: - ElementPtr() : next(nullptr) {} + ElementPtr() = default; ~ElementPtr() { ElementPtr* next_ptr = next.load(); @@ -110,12 +107,12 @@ private: } T current; - std::atomic next; + std::atomic next{nullptr}; }; ElementPtr* write_ptr; ElementPtr* read_ptr; - std::atomic size; + std::atomic_size_t size{0}; std::mutex cv_mutex; std::condition_variable cv; }; @@ -123,10 +120,10 @@ private: // a simple thread-safe, // single reader, multiple writer queue -template +template class MPSCQueue { public: - u32 Size() const { + std::size_t Size() const { return spsc_queue.Size(); } @@ -162,7 +159,7 @@ public: } private: - SPSCQueue spsc_queue; + SPSCQueue spsc_queue; std::mutex write_lock; }; } // namespace Common diff --git a/src/core/core_timing.h b/src/core/core_timing.h index 617c7c6d6..a51c00bba 100644 --- a/src/core/core_timing.h +++ b/src/core/core_timing.h @@ -218,7 +218,7 @@ private: u64 event_fifo_id = 0; // the queue for storing the events from other threads threadsafe until they will be added // to the event_queue by the emu thread - Common::MPSCQueue ts_queue; + Common::MPSCQueue ts_queue; s64 idled_cycles = 0; // Are we in a function that has been called from Advance()