31 throw std::runtime_error(
"Size must be a power of two");
42 size_t write =
mWrite.load(std::memory_order_relaxed);
65 size_t read =
mRead.load(std::memory_order_relaxed);
73 mRead.store(
read + 1, std::memory_order_release);
98 throw std::runtime_error(
"Size must be a power of two");
102 size_t write =
mWrite.load(std::memory_order_relaxed);
107 size_t read_cycle =
elem.readCycle.load(std::memory_order_acquire);
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);
126 size_t read =
mRead.load(std::memory_order_relaxed);
131 size_t read_cycle =
elem.readCycle.load(std::memory_order_acquire);
139 if (
mRead.compare_exchange_weak(
read,
read + 1, std::memory_order_relaxed))
142 elem.readCycle.store(
cycle + 1, std::memory_order_release);
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Atomic, bounded multi-producer multi-consumer FIFO ring buffer with a fixed maximum size.
Definition AtomicQueue.hpp:84
Vector< Data > mBuffer
Definition AtomicQueue.hpp:91
size_t mWriteCached
Definition AtomicQueue.hpp:93
MPMCQueue(size_t size, Allocator *alloc)
Definition AtomicQueue.hpp:95
Atomic< size_t > mRead
Definition AtomicQueue.hpp:92
bool Pop(T &out)
Definition AtomicQueue.hpp:124
const size_t mShift
Definition AtomicQueue.hpp:90
const size_t mModulo
Definition AtomicQueue.hpp:90
Atomic< size_t > mWrite
Definition AtomicQueue.hpp:92
bool Push(U &&data)
Definition AtomicQueue.hpp:101
Atomic, bounded single-producer single-consumer FIFO ring buffer with a fixed maximum size.
Definition AtomicQueue.hpp:14
size_t mReadCached
Definition AtomicQueue.hpp:19
const size_t mModulo
Definition AtomicQueue.hpp:15
bool Pop(T &out)
Try to pop data from the queue.
Definition AtomicQueue.hpp:63
Atomic< size_t > mWrite
Definition AtomicQueue.hpp:17
Atomic< size_t > mRead
Definition AtomicQueue.hpp:17
bool Push(U &&data)
Try to push data into the queue.
Definition AtomicQueue.hpp:40
size_t mWriteCached
Definition AtomicQueue.hpp:21
SPSCQueue(size_t size, Allocator *alloc)
Construct the SPSC Queue.
Definition AtomicQueue.hpp:28
Vector< T > mBuffer
Definition AtomicQueue.hpp:16
Lock-free atomic primitives and implementations of data structures.
Definition Allocator.hpp:5
std::vector< T, StlAllocator< T > > Vector
std::vector with explicit Foundation::Core::StlAllocator constructor
Definition Container.hpp:130
std::atomic< T > Atomic
Alias of std::atomic<T>.
Definition Atomic.hpp:26
T * Construct(Allocator *resource, Args &&...args)
Convenience placement new with object of type T using a Foundation::Core::Allocator.
Definition Allocator.hpp:149
Definition AtomicQueue.hpp:86
Atomic< size_t > writeCycle
Definition AtomicQueue.hpp:88
T data
Definition AtomicQueue.hpp:87
Atomic< size_t > readCycle
Definition AtomicQueue.hpp:88