25#ifndef MYSQL_HARNESS_MPSC_UNBOUND_QUEUE_INCLUDED
26#define MYSQL_HARNESS_MPSC_UNBOUND_QUEUE_INCLUDED
77 node->
next.store(
nullptr, std::memory_order_relaxed);
79 Node *prev_head =
head_.exchange(node, std::memory_order_acq_rel);
80 prev_head->
next.store(node, std::memory_order_release);
95 node->
data = std::move(item);
96 node->
next.store(
nullptr, std::memory_order_relaxed);
98 Node *prev_head =
head_.exchange(node, std::memory_order_acq_rel);
99 prev_head->
next.store(node, std::memory_order_release);
114 Node *tail =
tail_.load(std::memory_order_relaxed);
115 Node *next = tail->
next.load(std::memory_order_acquire);
117 if (next ==
nullptr) {
121 item = std::move(next->
data);
123 tail_.store(next, std::memory_order_relaxed);
133 std::atomic<Node *>
next{
nullptr};
a unbounded multi-producer single-consumer queue.
Definition: mpsc_queue.h:42
~MPSCQueueDV()
Definition: mpsc_queue.h:49
MPSCQueueDV()
Definition: mpsc_queue.h:46
MPSCQueueDV(MPSCQueueDV &&)=default
MPSCQueueDV(const MPSCQueueDV &)=delete
bool enqueue(const T &item)
enqueue an element.
Definition: mpsc_queue.h:74
MPSCQueueDV & operator=(MPSCQueueDV &&)=default
T value_type
Definition: mpsc_queue.h:44
bool dequeue(T &item)
try to dequeue element.
Definition: mpsc_queue.h:113
MPSCQueueDV & operator=(const MPSCQueueDV &)=delete
bool enqueue(T &&item)
enqueue an element.
Definition: mpsc_queue.h:93
std::atomic< Node * > tail_
Definition: mpsc_queue.h:137
std::atomic< Node * > head_
Definition: mpsc_queue.h:136
provide waiting pop and push operator to thread-safe queues.
Definition: waiting_queue_adaptor.h:38
bool load(THD *, const dd::String_type &fname, dd::String_type *buf)
Read an sdi file from disk and store in a buffer.
Definition: sdi_file.cc:307
Definition: varlen_sort.h:183
Definition: mpsc_queue.h:131
T data
Definition: mpsc_queue.h:132
std::atomic< Node * > next
Definition: mpsc_queue.h:133
int front
Definition: xcom_base.cc:4083