summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2019-02-14 03:41:25 +0100
committerGitHub <noreply@github.com>2019-02-14 03:41:25 +0100
commitf0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c (patch)
tree81f2416a1735d9f01022b4d905eb4d1db7baa304
parentMerge pull request #2099 from greggameplayer/BGRA8-Framebuffer-Real (diff)
parentthreadsafe_queue: Use std::size_t for representing size (diff)
downloadyuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar.gz
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar.bz2
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar.lz
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar.xz
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.tar.zst
yuzu-f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c.zip
-rw-r--r--src/common/threadsafe_queue.h35
-rw-r--r--src/core/core_timing.cpp4
2 files changed, 18 insertions, 21 deletions
diff --git a/src/common/threadsafe_queue.h b/src/common/threadsafe_queue.h
index edf13bc49..f553efdc9 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 <algorithm>
#include <atomic>
#include <cstddef>
#include <mutex>
-#include "common/common_types.h"
+#include <utility>
namespace Common {
-template <typename T, bool NeedSize = true>
+template <typename T>
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<ElementPtr*> next;
+ std::atomic<ElementPtr*> next{nullptr};
};
ElementPtr* write_ptr;
ElementPtr* read_ptr;
- std::atomic<u32> size;
+ std::atomic_size_t size{0};
};
// a simple thread-safe,
// single reader, multiple writer queue
-template <typename T, bool NeedSize = true>
+template <typename T>
class MPSCQueue {
public:
- u32 Size() const {
+ std::size_t Size() const {
return spsc_queue.Size();
}
@@ -144,7 +141,7 @@ public:
}
private:
- SPSCQueue<T, NeedSize> spsc_queue;
+ SPSCQueue<T> spsc_queue;
std::mutex write_lock;
};
} // namespace Common
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 2b7ca9766..0308030c5 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -54,10 +54,10 @@ static std::vector<Event> 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<Event, false> ts_queue;
+static Common::MPSCQueue<Event> ts_queue;
// the queue for unscheduling the events from other threads threadsafe
-static Common::MPSCQueue<std::pair<const EventType*, u64>, false> unschedule_queue;
+static Common::MPSCQueue<std::pair<const EventType*, u64>> unschedule_queue;
constexpr int MAX_SLICE_LENGTH = 20000;