50 mData.Resize(size + 1);
59 const auto currentWriteIndex = mWriteIndex.load(std::memory_order_relaxed);
60 const auto nextWriteIndex = Increment(currentWriteIndex);
61 if(nextWriteIndex != mReadIndex.load(std::memory_order_acquire))
63 mData.Get()[currentWriteIndex] = item;
64 mWriteIndex.store(nextWriteIndex, std::memory_order_release);
76 const auto currentReadIndex = mReadIndex.load(std::memory_order_relaxed);
77 if(currentReadIndex == mWriteIndex.load(std::memory_order_acquire))
81 item = mData.Get()[currentReadIndex];
82 mReadIndex.store(Increment(currentReadIndex), std::memory_order_release);
90 size_t write = mWriteIndex.load(std::memory_order_acquire);
91 size_t read = mReadIndex.load(std::memory_order_relaxed);
93 return (read > write) ? mData.GetSize() - (read - write) : write - read;
102 const auto currentReadIndex = mReadIndex.load(std::memory_order_relaxed);
103 return mData.Get()[currentReadIndex];
111 return (mWriteIndex.load() == mReadIndex.load());
119 const auto nextWriteIndex = Increment(mWriteIndex.load());
120 return (nextWriteIndex == mReadIndex.load());
127 size_t Increment(
size_t idx)
const
129 return (idx + 1) % (mData.GetSize());
132 WDL_TypedBuf<T> mData;
133 std::atomic<size_t> mWriteIndex{0};
134 std::atomic<size_t> mReadIndex{0};
A lock-free SPSC queue used to transfer data between threads based on MLQueue.h by Randy Jones based ...
size_t ElementsAvailable() const
IPlugQueue(int size)
IPlugQueue constructor.