43 size_t write =
mWrite.load(std::memory_order_relaxed);
54 mWrite.store(write + 1, std::memory_order_release);
66 size_t read =
mRead.load(std::memory_order_relaxed);
74 mRead.store(read + 1, std::memory_order_release);
102 template <
typename U>
105 size_t write =
mWrite.load(std::memory_order_relaxed);
109 size_t cycle = write >>
mShift;
110 size_t read_cycle = elem.readCycle.load(std::memory_order_acquire);
112 if (read_cycle == cycle) [[likely]]
115 if (
mWrite.compare_exchange_weak(write, write + 1, std::memory_order_relaxed))
117 elem.data = std::forward<U>(data);
118 elem.writeCycle.store(cycle + 1, std::memory_order_release);
122 else if (read_cycle >= cycle)
125 write =
mWrite.load(std::memory_order_relaxed);
135 size_t read =
mRead.load(std::memory_order_relaxed);
140 size_t cycle = read >>
mShift;
141 size_t write_cycle = elem.writeCycle.load(std::memory_order_acquire);
142 if (write_cycle == cycle + 1)
145 if (
mRead.compare_exchange_weak(read, read + 1, std::memory_order_relaxed))
147 out = std::move(elem.data);
148 elem.readCycle.store(cycle + 1, std::memory_order_release);
152 else if (write_cycle > cycle)
154 read =
mRead.load(std::memory_order_relaxed);
#define CHECK_MSG(expr, format_str,...)
Allocator interface (noexcept)
Definition Allocator.hpp:29
Atomic, bounded multi-producer multi-consumer FIFO ring buffer with a fixed maximum size.
Definition AtomicQueue.hpp:85
Vector< Data > mBuffer
Definition AtomicQueue.hpp:92
size_t mWriteCached
Definition AtomicQueue.hpp:94
MPMCQueue(size_t size, Allocator *alloc)
Definition AtomicQueue.hpp:97
Atomic< size_t > mRead
Definition AtomicQueue.hpp:93
bool Pop(T &out)
Definition AtomicQueue.hpp:133
const size_t mShift
Definition AtomicQueue.hpp:91
const size_t mModulo
Definition AtomicQueue.hpp:91
Atomic< size_t > mWrite
Definition AtomicQueue.hpp:93
bool Push(U &&data)
Definition AtomicQueue.hpp:103
Atomic, bounded single-producer single-consumer FIFO ring buffer with a fixed maximum size.
Definition AtomicQueue.hpp:15
size_t mReadCached
Definition AtomicQueue.hpp:20
const size_t mModulo
Definition AtomicQueue.hpp:16
bool Pop(T &out)
Try to pop data from the queue.
Definition AtomicQueue.hpp:64
Atomic< size_t > mWrite
Definition AtomicQueue.hpp:18
Atomic< size_t > mRead
Definition AtomicQueue.hpp:18
bool Push(U &&data)
Try to push data into the queue.
Definition AtomicQueue.hpp:41
size_t mWriteCached
Definition AtomicQueue.hpp:22
SPSCQueue(size_t size, Allocator *alloc)
Construct the SPSC Queue.
Definition AtomicQueue.hpp:30
Vector< T > mBuffer
Definition AtomicQueue.hpp:17
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:6
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:149
std::atomic< T > Atomic
Alias of std::atomic<T>.
Definition Atomic.hpp:26
Definition AtomicQueue.hpp:87
Atomic< size_t > writeCycle
Definition AtomicQueue.hpp:89
T data
Definition AtomicQueue.hpp:88
Atomic< size_t > readCycle
Definition AtomicQueue.hpp:89