Просмотр исходного кода

Merge pull request #2116 from lioncash/size

 threadsafe_queue: Remove NeedSize template parameter
bunnei 7 лет назад
Родитель
Сommit
f0c4ac9abd
2 измененных файлов с 18 добавлено и 21 удалено
  1. 16 19
      src/common/threadsafe_queue.h
  2. 2 2
      src/core/core_timing.cpp

+ 16 - 19
src/common/threadsafe_queue.h

@@ -7,17 +7,16 @@
 // a simple lockless thread-safe,
 // a simple lockless thread-safe,
 // single reader, single writer queue
 // single reader, single writer queue
 
 
-#include <algorithm>
 #include <atomic>
 #include <atomic>
 #include <cstddef>
 #include <cstddef>
 #include <mutex>
 #include <mutex>
-#include "common/common_types.h"
+#include <utility>
 
 
 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() {
@@ -25,13 +24,12 @@ public:
         delete read_ptr;
         delete read_ptr;
     }
     }
 
 
-    u32 Size() const {
-        static_assert(NeedSize, "using Size() on FifoQueue without NeedSize");
+    std::size_t Size() const {
         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 {
@@ -47,13 +45,13 @@ 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++;
+
+        ++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();
@@ -66,8 +64,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);
@@ -89,7 +86,7 @@ private:
     // and a pointer to the next ElementPtr
     // and a pointer to the next ElementPtr
     class ElementPtr {
     class ElementPtr {
     public:
     public:
-        ElementPtr() : next(nullptr) {}
+        ElementPtr() {}
         ~ElementPtr() {
         ~ElementPtr() {
             ElementPtr* next_ptr = next.load();
             ElementPtr* next_ptr = next.load();
 
 
@@ -98,21 +95,21 @@ private:
         }
         }
 
 
         T current;
         T current;
-        std::atomic<ElementPtr*> next;
+        std::atomic<ElementPtr*> next{nullptr};
     };
     };
 
 
     ElementPtr* write_ptr;
     ElementPtr* write_ptr;
     ElementPtr* read_ptr;
     ElementPtr* read_ptr;
-    std::atomic<u32> size;
+    std::atomic_size_t size{0};
 };
 };
 
 
 // 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 {
+    std::size_t Size() const {
         return spsc_queue.Size();
         return spsc_queue.Size();
     }
     }
 
 
@@ -144,7 +141,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

+ 2 - 2
src/core/core_timing.cpp

@@ -54,10 +54,10 @@ static std::vector<Event> event_queue;
 static u64 event_fifo_id;
 static u64 event_fifo_id;
 // 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
-static Common::MPSCQueue<Event, false> ts_queue;
+static Common::MPSCQueue<Event> ts_queue;
 
 
 // the queue for unscheduling the events from other threads threadsafe
 // 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;
 constexpr int MAX_SLICE_LENGTH = 20000;