36 Node* front =
_head.load(std::memory_order_relaxed);
37 front->
Next.store(
nullptr, std::memory_order_relaxed);
46 Node* front =
_head.load(std::memory_order_relaxed);
53 Node* prevHead =
_head.exchange(node, std::memory_order_acq_rel);
54 prevHead->
Next.store(node, std::memory_order_release);
59 Node* tail =
_tail.load(std::memory_order_relaxed);
60 Node* next = tail->
Next.load(std::memory_order_acquire);
65 _tail.store(next, std::memory_order_release);
76 Next.store(
nullptr, std::memory_order_relaxed);
92template<
typename T, std::atomic<T*> T::* IntrusiveLink>
100 std::atomic<T*>* dummyNext =
new (&(
_dummyPtr->*IntrusiveLink)) std::atomic<T*>();
101 dummyNext->store(
nullptr, std::memory_order_relaxed);
113 (input->*IntrusiveLink).store(
nullptr, std::memory_order_release);
114 T* prevHead =
_head.exchange(input, std::memory_order_acq_rel);
115 (prevHead->*IntrusiveLink).store(input, std::memory_order_release);
120 T* tail =
_tail.load(std::memory_order_relaxed);
121 T* next = (tail->*IntrusiveLink).load(std::memory_order_acquire);
127 _tail.store(next, std::memory_order_release);
129 next = (next->*IntrusiveLink).load(std::memory_order_acquire);
134 _tail.store(next, std::memory_order_release);
139 T* head =
_head.load(std::memory_order_acquire);
144 next = (tail->*IntrusiveLink).load(std::memory_order_acquire);
147 _tail.store(next, std::memory_order_release);
155 std::aligned_storage_t<
sizeof(T),
alignof(T)>
_dummy;
166template<
typename T, std::atomic<T*> T::* IntrusiveLink =
nullptr>
std::conditional_t< IntrusiveLink !=nullptr, Trinity::Impl::MPSCQueueIntrusive< T, IntrusiveLink >, Trinity::Impl::MPSCQueueNonIntrusive< T > > MPSCQueue
MPSCQueueIntrusive(MPSCQueueIntrusive const &)=delete
MPSCQueueIntrusive & operator=(MPSCQueueIntrusive const &)=delete
std::aligned_storage_t< sizeof(T), alignof(T)> _dummy
MPSCQueueNonIntrusive & operator=(MPSCQueueNonIntrusive const &)=delete
std::atomic< Node * > _head
std::atomic< Node * > _tail
MPSCQueueNonIntrusive(MPSCQueueNonIntrusive const &)=delete
std::atomic< Node * > Next