48 mData.Resize(size + 1);
57 const auto currentWriteIndex = mWriteIndex.load(std::memory_order_relaxed);
58 const auto nextWriteIndex = Increment(currentWriteIndex);
59 if(nextWriteIndex != mReadIndex.load(std::memory_order_acquire))
61 mData.Get()[currentWriteIndex] = item;
62 mWriteIndex.store(nextWriteIndex, std::memory_order_release);
74 const auto currentReadIndex = mReadIndex.load(std::memory_order_relaxed);
75 if(currentReadIndex == mWriteIndex.load(std::memory_order_acquire))
79 item = mData.Get()[currentReadIndex];
80 mReadIndex.store(Increment(currentReadIndex), std::memory_order_release);
88 return (mWriteIndex.load(std::memory_order_acquire) - mReadIndex.load(std::memory_order_relaxed))%mData.GetSize();
97 const auto currentReadIndex = mReadIndex.load(std::memory_order_relaxed);
98 return mData[currentReadIndex];
106 return (mWriteIndex.load() == mReadIndex.load());
114 const auto nextWriteIndex = Increment(mWriteIndex.load());
115 return (nextWriteIndex == mReadIndex.load());
122 size_t Increment(
size_t idx)
const 124 return (idx + 1) % (mData.GetSize());
127 WDL_TypedBuf<T> mData;
128 std::atomic<size_t> mWriteIndex{0};
129 std::atomic<size_t> mReadIndex{0};
IPlugQueue(int size)
IPlugQueue constructor.
size_t ElementsAvailable() const
A lock-free SPSC queue used to transfer data between threads based on MLQueue.h by Randy Jones based ...