23#ifndef GCS_MPSC_QUEUE_INCLUDED
24#define GCS_MPSC_QUEUE_INCLUDED
38template <
typename T,
typename Deleter = std::default_delete<T>>
57 m_next.store(
nullptr, std::memory_order_relaxed);
72 return m_next.load(memory_order);
81 m_next.store(node, memory_order);
101 std::atomic<Gcs_mpsc_queue_node *>
m_next;
122 for (T *payload =
pop(); payload !=
nullptr; payload =
pop()) {
126 assert(
m_tail ==
m_head.load(std::memory_order_relaxed));
141 bool successful =
false;
143 if (new_node !=
nullptr) {
145 m_head.exchange(new_node, std::memory_order_acq_rel);
146 previous->
set_next(new_node, std::memory_order_release);
175 std::atomic<Gcs_mpsc_queue_node *>
m_head;
Definition: tls_cipher.cc:36
Node that holds an element (payload) of the MPSC queue.
Definition: gcs_mpsc_queue.h:44
T * m_payload
The payload.
Definition: gcs_mpsc_queue.h:105
Gcs_mpsc_queue_node(Gcs_mpsc_queue_node &&)=delete
Gcs_mpsc_queue_node & operator=(Gcs_mpsc_queue_node const &)=delete
void set_next(Gcs_mpsc_queue_node *node, std::memory_order memory_order)
Links a node to this node.
Definition: gcs_mpsc_queue.h:80
Gcs_mpsc_queue_node()
Creates an unlinked and empty node.
Definition: gcs_mpsc_queue.h:49
std::atomic< Gcs_mpsc_queue_node * > m_next
The next node in the linked list.
Definition: gcs_mpsc_queue.h:101
Gcs_mpsc_queue_node(T *initial_payload)
Creates an unlinked node with the given payload.
Definition: gcs_mpsc_queue.h:56
Gcs_mpsc_queue_node * get_next(std::memory_order memory_order)
Gets the next node in the linked list.
Definition: gcs_mpsc_queue.h:71
Gcs_mpsc_queue_node & operator=(Gcs_mpsc_queue_node &&)=delete
Gcs_mpsc_queue_node(Gcs_mpsc_queue_node const &)=delete
T * extract_payload()
Extracts the payload from this node.
Definition: gcs_mpsc_queue.h:91
MPSC queue with FIFO semantics.
Definition: gcs_mpsc_queue.h:39
Gcs_mpsc_queue_node * m_tail
Definition: gcs_mpsc_queue.h:174
Gcs_mpsc_queue & operator=(Gcs_mpsc_queue &&)=delete
std::atomic< Gcs_mpsc_queue_node * > m_head
Definition: gcs_mpsc_queue.h:175
Gcs_mpsc_queue(Deleter custom_deleter)
Definition: gcs_mpsc_queue.h:113
Gcs_mpsc_queue(Gcs_mpsc_queue &&)=delete
Deleter m_payload_deleter
Definition: gcs_mpsc_queue.h:173
T * pop()
Attempt to retrieve the first element from the queue.
Definition: gcs_mpsc_queue.h:159
Gcs_mpsc_queue & operator=(Gcs_mpsc_queue const &)=delete
~Gcs_mpsc_queue()
Destroy the queued nodes.
Definition: gcs_mpsc_queue.h:120
Gcs_mpsc_queue()
Create an empty queue.
Definition: gcs_mpsc_queue.h:112
bool push(T *payload)
Insert payload at the end of the queue.
Definition: gcs_mpsc_queue.h:140
Gcs_mpsc_queue(Gcs_mpsc_queue const &)=delete
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:221
static std::atomic< uchar * > & next_node(LF_PINBOX *P, uchar *X)
Definition: lf_alloc-pin.cc:349
struct result result
Definition: result.h:33