diff options
| author | bunnei <bunneidev@gmail.com> | 2019-02-13 21:41:25 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-13 21:41:25 -0500 | 
| commit | f0c4ac9abd75af3d3f1aebb6d60f8a27663a6a5c (patch) | |
| tree | 81f2416a1735d9f01022b4d905eb4d1db7baa304 | |
| parent | cd542d5aacc3ac8eec5ca5be182a76da56c19d05 (diff) | |
| parent | 0829ef97cac6cb96c49d1401433d9f46639bfeb8 (diff) | |
Merge pull request #2116 from lioncash/size
 threadsafe_queue: Remove NeedSize template parameter
| -rw-r--r-- | src/common/threadsafe_queue.h | 35 | ||||
| -rw-r--r-- | src/core/core_timing.cpp | 4 | 
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; | 
