AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Acore::Impl::MPSCQueueNonIntrusive< T > Class Template Reference

#include "MPSCQueue.h"

Classes

struct  Node
 

Public Member Functions

 MPSCQueueNonIntrusive ()
 
 ~MPSCQueueNonIntrusive ()
 
void Enqueue (T *input)
 
bool Dequeue (T *&result)
 

Private Member Functions

 MPSCQueueNonIntrusive (MPSCQueueNonIntrusive const &)=delete
 
MPSCQueueNonIntrusiveoperator= (MPSCQueueNonIntrusive const &)=delete
 

Private Attributes

std::atomic< Node * > _head
 
std::atomic< Node * > _tail
 

Detailed Description

template<typename T>
class Acore::Impl::MPSCQueueNonIntrusive< T >

Constructor & Destructor Documentation

◆ MPSCQueueNonIntrusive() [1/2]

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::MPSCQueueNonIntrusive ( )
inline
33 : _head(new Node()), _tail(_head.load(std::memory_order_relaxed))
34 {
35 Node* front = _head.load(std::memory_order_relaxed);
36 front->Next.store(nullptr, std::memory_order_relaxed);
37 }
std::atomic< Node * > _head
Definition: MPSCQueue.h:82
std::atomic< Node * > _tail
Definition: MPSCQueue.h:83

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

◆ ~MPSCQueueNonIntrusive()

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::~MPSCQueueNonIntrusive ( )
inline
40 {
41 T* output;
42 while (Dequeue(output))
43 delete output;
44
45 Node* front = _head.load(std::memory_order_relaxed);
46 delete front;
47 }
bool Dequeue(T *&result)
Definition: MPSCQueue.h:56

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, and Acore::Impl::MPSCQueueNonIntrusive< T >::Dequeue().

◆ MPSCQueueNonIntrusive() [2/2]

template<typename T >
Acore::Impl::MPSCQueueNonIntrusive< T >::MPSCQueueNonIntrusive ( MPSCQueueNonIntrusive< T > const &  )
privatedelete

Member Function Documentation

◆ Dequeue()

template<typename T >
bool Acore::Impl::MPSCQueueNonIntrusive< T >::Dequeue ( T *&  result)
inline
57 {
58 Node* tail = _tail.load(std::memory_order_relaxed);
59 Node* next = tail->Next.load(std::memory_order_acquire);
60 if (!next)
61 return false;
62
63 result = next->Data;
64 _tail.store(next, std::memory_order_release);
65 delete tail;
66 return true;
67 }

References Acore::Impl::MPSCQueueNonIntrusive< T >::_tail, Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Data, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

Referenced by Acore::Impl::MPSCQueueNonIntrusive< T >::~MPSCQueueNonIntrusive().

◆ Enqueue()

template<typename T >
void Acore::Impl::MPSCQueueNonIntrusive< T >::Enqueue ( T *  input)
inline
50 {
51 Node* node = new Node(input);
52 Node* prevHead = _head.exchange(node, std::memory_order_acq_rel);
53 prevHead->Next.store(node, std::memory_order_release);
54 }

References Acore::Impl::MPSCQueueNonIntrusive< T >::_head, and Acore::Impl::MPSCQueueNonIntrusive< T >::Node::Next.

◆ operator=()

template<typename T >
MPSCQueueNonIntrusive & Acore::Impl::MPSCQueueNonIntrusive< T >::operator= ( MPSCQueueNonIntrusive< T > const &  )
privatedelete

Member Data Documentation

◆ _head

◆ _tail

template<typename T >
std::atomic<Node*> Acore::Impl::MPSCQueueNonIntrusive< T >::_tail
private