23 size_t head =
head_pos.load(std::memory_order_relaxed);
24 size_t tail =
tail_pos.load(std::memory_order_relaxed);
25 for (
size_t i = head; i != tail; ++i)
34 for (
size_t i = 1; i <=
sizeof(
void*) * 4; i <<= 1)
44 p_node[i].
tail.store(i, std::memory_order_relaxed);
45 p_node[i].
head.store((
size_t)-1, std::memory_order_relaxed);
48 tail_pos.store(0, std::memory_order_relaxed);
49 head_pos.store(0, std::memory_order_relaxed);
55 size_t head =
head_pos.load(std::memory_order_acquire);
56 return tail_pos.load(std::memory_order_relaxed) - head;
61 size_t tail =
tail_pos.load(std::memory_order_relaxed);
64 if (node->
tail.load(std::memory_order_relaxed) != tail)
return false;
65 if ((
tail_pos.compare_exchange_weak(tail, tail + 1,
66 std::memory_order_relaxed)))
71 new (&node->
data) T(std::move(data));
72 node->
head.store(tail, std::memory_order_release);
78 size_t tail =
tail_pos.load(std::memory_order_relaxed);
81 if (node->
tail.load(std::memory_order_relaxed) != tail)
return false;
82 if ((
tail_pos.compare_exchange_weak(tail, tail + 1,
83 std::memory_order_relaxed)))
86 new (&node->
data) T(data);
87 node->
head.store(tail, std::memory_order_release);
97 size_t head =
head_pos.load(std::memory_order_relaxed);
100 if (node->
head.load(std::memory_order_relaxed) != head)
return false;
101 if (
head_pos.compare_exchange_weak(head, head + 1,
102 std::memory_order_relaxed))
106 result = std::move(node->
data);
A simple single producer, single consumer lock free queue.
Definition: QueueLockFree.h:15
void clear()
Definition: QueueLockFree.h:112
Vector< Node > vector
Definition: QueueLockFree.h:130
bool dequeue(const T &&data)
Definition: QueueLockFree.h:91
void resize(size_t capacity)
Definition: QueueLockFree.h:31
size_t size() const
Definition: QueueLockFree.h:54
~QueueLockFree()
Definition: QueueLockFree.h:21
size_t capacity() const
Definition: QueueLockFree.h:52
bool enqueue(T &data)
Definition: QueueLockFree.h:76
size_t capacity_value
Definition: QueueLockFree.h:127
bool enqueue(T &&data)
Definition: QueueLockFree.h:59
std::atomic< size_t > tail_pos
Definition: QueueLockFree.h:128
size_t capacity_mask
Definition: QueueLockFree.h:126
std::atomic< size_t > head_pos
Definition: QueueLockFree.h:129
bool dequeue(T &result)
Definition: QueueLockFree.h:95
QueueLockFree(size_t capacity)
Definition: QueueLockFree.h:17
Node * p_node
Definition: QueueLockFree.h:125
Lightweight wrapper around std::vector with Arduino-friendly helpers and a pluggable allocator.
Definition: Vector.h:39
Definition: Allocator.h:13
QueueLockFree Node.
Definition: QueueLockFree.h:119
std::atomic< size_t > head
Definition: QueueLockFree.h:122
std::atomic< size_t > tail
Definition: QueueLockFree.h:121
T data
Definition: QueueLockFree.h:120