citra-emu
/
citra-canary
Archived
1
0
Fork 0

threadsafe_queue: Remove NeedSize template parameter

The necessity of this parameter is dubious at best, and in 2019 probably
offers completely negligible savings as opposed to just leaving this
enabled. This removes it and simplifies the overall interface.
This commit is contained in:
Lioncash 2019-02-12 22:03:48 -05:00 committed by fearlessTobi
parent de1128c60d
commit 3bc78e577f
2 changed files with 11 additions and 13 deletions

View File

@ -15,10 +15,10 @@
#include "common/common_types.h" #include "common/common_types.h"
namespace Common { namespace Common {
template <typename T, bool NeedSize = true> template <typename T>
class SPSCQueue { class SPSCQueue {
public: public:
SPSCQueue() : size(0) { SPSCQueue() {
write_ptr = read_ptr = new ElementPtr(); write_ptr = read_ptr = new ElementPtr();
} }
~SPSCQueue() { ~SPSCQueue() {
@ -27,12 +27,11 @@ public:
} }
u32 Size() const { u32 Size() const {
static_assert(NeedSize, "using Size() on FifoQueue without NeedSize");
return size.load(); return size.load();
} }
bool Empty() const { bool Empty() const {
return !read_ptr->next.load(); return Size() == 0;
} }
T& Front() const { T& Front() const {
@ -48,14 +47,14 @@ public:
ElementPtr* new_ptr = new ElementPtr(); ElementPtr* new_ptr = new ElementPtr();
write_ptr->next.store(new_ptr, std::memory_order_release); write_ptr->next.store(new_ptr, std::memory_order_release);
write_ptr = new_ptr; write_ptr = new_ptr;
if (NeedSize)
size++;
cv.notify_one(); cv.notify_one();
++size;
} }
void Pop() { void Pop() {
if (NeedSize) --size;
size--;
ElementPtr* tmpptr = read_ptr; ElementPtr* tmpptr = read_ptr;
// advance the read pointer // advance the read pointer
read_ptr = tmpptr->next.load(); read_ptr = tmpptr->next.load();
@ -68,8 +67,7 @@ public:
if (Empty()) if (Empty())
return false; return false;
if (NeedSize) --size;
size--;
ElementPtr* tmpptr = read_ptr; ElementPtr* tmpptr = read_ptr;
read_ptr = tmpptr->next.load(std::memory_order_acquire); read_ptr = tmpptr->next.load(std::memory_order_acquire);
@ -123,7 +121,7 @@ private:
// a simple thread-safe, // a simple thread-safe,
// single reader, multiple writer queue // single reader, multiple writer queue
template <typename T, bool NeedSize = true> template <typename T>
class MPSCQueue { class MPSCQueue {
public: public:
u32 Size() const { u32 Size() const {
@ -162,7 +160,7 @@ public:
} }
private: private:
SPSCQueue<T, NeedSize> spsc_queue; SPSCQueue<T> spsc_queue;
std::mutex write_lock; std::mutex write_lock;
}; };
} // namespace Common } // namespace Common

View File

@ -218,7 +218,7 @@ private:
u64 event_fifo_id = 0; u64 event_fifo_id = 0;
// the queue for storing the events from other threads threadsafe until they will be added // the queue for storing the events from other threads threadsafe until they will be added
// to the event_queue by the emu thread // to the event_queue by the emu thread
Common::MPSCQueue<Event, false> ts_queue; Common::MPSCQueue<Event> ts_queue;
s64 idled_cycles = 0; s64 idled_cycles = 0;
// Are we in a function that has been called from Advance() // Are we in a function that has been called from Advance()