8 #ifndef INCL_evo_atomic_buffer_queue_h 9 #define INCL_evo_atomic_buffer_queue_h 58 template<
class T,
class TSize=SizeT>
72 buf_ =
new Item[
size];
74 size_mask_ =
size - 1;
101 return (Size)(cursor < read ? 0 : cursor + 1 - read);
119 return (
used() >= size_);
150 buf_[seq & size_mask_] = item;
155 const uint64 prev_seq = seq - 1;
180 return buf_[seq & size_mask_];
194 const uint64 prev_seq = seq - 1;
213 item = buf_[seq & size_mask_];
223 This& operator=(
const This&);
#define EVO_EXCEPTION_GUARD_START
Start exception guard (try block).
Definition: container.h:52
void store(T num, MemOrder mem_order=std::memory_order_seq_cst)
Store new value.
bool pop(Item &item)
Pop oldest item from queue.
Definition: atomic_buffer_queue.h:209
#define EVO_ATOMIC_ACQ_REL
Combined "acquire" & "release" level memory barrier.
Definition: atomic.h:33
#define EVO_EXCEPTION_GUARD_END
End exception guard, catch and abort().
Definition: container.h:55
Item & add_start(uint64 &seq)
Start adding item to queue directly.
Definition: atomic_buffer_queue.h:172
Size used() const
Get used item count.
Definition: atomic_buffer_queue.h:98
bool full() const
Get whether queue is full.
Definition: atomic_buffer_queue.h:118
~AtomicBufferQueue()
Destructor.
Definition: atomic_buffer_queue.h:80
#define EVO_ATOMIC_FENCE(MEM_ORDER)
Sets a memory fence/barrier.
Definition: atomic.h:52
Size size() const
Get buffer size.
Definition: atomic_buffer_queue.h:89
T Item
Item type.
Definition: atomic_buffer_queue.h:63
bool compare_set(T cmpval, T newval, MemOrder mem_order_success=std::memory_order_seq_cst, MemOrder mem_order_failure=std::memory_order_acquire)
Compare and set, storing new value if comparison matches.
Definition: atomic.h:332
#define EVO_ATOMIC_ACQUIRE
Start "acquire" memory ordering barrier, usually followed by a matching "release" barrier...
Definition: atomic.h:27
TSize Size
Queue size integer type (always unsigned)
Definition: atomic_buffer_queue.h:62
void clear()
Clear all items from queue, making it empty.
Definition: atomic_buffer_queue.h:125
static const Size DEFAULT_SIZE
Default size to use.
Definition: atomic_buffer_queue.h:65
Evo C++ Library namespace.
Definition: alg.h:11
#define EVO_ATOMIC_RELEASE
Release (end) memory ordering barrier started with "consume" or "acquire" barrier.
Definition: atomic.h:30
void add_commit(uint64 seq)
Commit adding an item.
Definition: atomic_buffer_queue.h:191
T fetch_add(T num, MemOrder mem_order=std::memory_order_seq_cst)
Add number to value and return the previous value.
AtomicBufferQueue(Size size=DEFAULT_SIZE)
Constructor, sets buffer size.
Definition: atomic_buffer_queue.h:70
Fast buffer-based queue, implemented with a ring-buffer.
Definition: atomic_buffer_queue.h:59
AddConst< T >::Type & PassType
Most efficient type for passing as parameter (const-reference or POD value).
Definition: container.h:551
void add(typename DataCopy< Item >::PassType item)
Add item to queue.
Definition: atomic_buffer_queue.h:141
bool sleepus(ulongl usec)
Sleep for number of microseconds.
Definition: sys.h:679
T load(MemOrder mem_order=std::memory_order_seq_cst) const
Load and return current value.
AtomicBufferQueue< T, TSize > This
This type
Definition: atomic_buffer_queue.h:61
Size size_pow2(Size size, Size minsize=2)
Get size as power of 2.
Definition: type.h:1951
bool empty() const
Get whether queue is empty.
Definition: atomic_buffer_queue.h:109