diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h index edf13bc496..f553efdc9a 100644 --- a/src/common/threadsafe_queue.h +++ b/src/common/threadsafe_queue.h @@ -7,17 +7,16 @@ // a simple lockless thread-safe, // single reader, single writer queue -#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() { @@ -25,13 +24,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 { @@ -47,13 +45,13 @@ public: ElementPtr* new_ptr = new ElementPtr(); write_ptr->next.store(new_ptr, std::memory_order_release); write_ptr = new_ptr; - if (NeedSize) - size++; + + ++size; } void Pop() { - if (NeedSize) - size--; + --size; + ElementPtr* tmpptr = read_ptr; // advance the read pointer read_ptr = tmpptr->next.load(); @@ -66,8 +64,7 @@ public: if (Empty()) return false; - if (NeedSize) - size--; + --size; ElementPtr* tmpptr = read_ptr; read_ptr = tmpptr->next.load(std::memory_order_acquire); @@ -89,7 +86,7 @@ private: // and a pointer to the next ElementPtr class ElementPtr { public: - ElementPtr() : next(nullptr) {} + ElementPtr() {} ~ElementPtr() { ElementPtr* next_ptr = next.load(); @@ -98,21 +95,21 @@ 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}; }; // 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(); } @@ -144,7 +141,7 @@ public: } private: - SPSCQueue spsc_queue; + SPSCQueue spsc_queue; std::mutex write_lock; }; } // namespace Common diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 2b7ca97664..0308030c55 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -54,10 +54,10 @@ static std::vector event_queue; static u64 event_fifo_id; // the queue for storing the events from other threads threadsafe until they will be added // to the event_queue by the emu thread -static Common::MPSCQueue ts_queue; +static Common::MPSCQueue ts_queue; // the queue for unscheduling the events from other threads threadsafe -static Common::MPSCQueue, false> unschedule_queue; +static Common::MPSCQueue> unschedule_queue; constexpr int MAX_SLICE_LENGTH = 20000;