24 template<
typename T,
typename AllocatorType = FMemory>
30 std::atomic<FNode*>
Next{
nullptr };
34 std::atomic<FNode*> Head{
nullptr };
43 static_assert(std::is_trivially_destructible_v<FNode>);
44 if (Head.load(std::memory_order_acquire) !=
nullptr)
56 FNode*
New = ::new(AllocatorType::Malloc(
sizeof(FNode),
alignof(FNode))) FNode;
60 FNode* Prev = Head.load(std::memory_order_relaxed);
63 New->Next.store(Prev, std::memory_order_relaxed);
64 }
while (!Head.compare_exchange_weak(Prev,
New, std::memory_order_acq_rel, std::memory_order_relaxed));
91 return Head.load(std::memory_order_relaxed) ==
nullptr;
95 template<
bool bReverse,
typename F>
99 FNode* Node = Head.exchange(
nullptr, std::memory_order_acq_rel);
108 FNode* Prev =
nullptr;
112 Node = Node->Next.exchange(Prev, std::memory_order_relaxed);
120 FNode*
Next = Node->Next.load(std::memory_order_relaxed);
121 T* ValuePtr = Node->Item.GetTypedPtr();
124 AllocatorType::Free(Node);
FORCEINLINE constexpr void DestructItem(ElementType *Element)
Definition MemoryOps.h:56
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
T * New(FMemStackBase &Mem, int32 Count=1, int32 Align=DEFAULT_ALIGNMENT)
Definition MemStack.h:259
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition ConsumeAllMpmcQueue.h:26
TConsumeAllMpmcQueue()=default
EConsumeAllMpmcQueueResult ConsumeAllLifo(const F &Consumer)
Definition ConsumeAllMpmcQueue.h:73
bool IsEmpty() const
Definition ConsumeAllMpmcQueue.h:89
EConsumeAllMpmcQueueResult ConsumeAllFifo(const F &Consumer)
Definition ConsumeAllMpmcQueue.h:83
~TConsumeAllMpmcQueue()
Definition ConsumeAllMpmcQueue.h:41
UE_NONCOPYABLE(TConsumeAllMpmcQueue)
EConsumeAllMpmcQueueResult ProduceItem(ArgTypes &&... Args)
Definition ConsumeAllMpmcQueue.h:54
Definition AdvancedWidgetsModule.cpp:13
EConsumeAllMpmcQueueResult
Definition ConsumeAllMpmcQueue.h:15
Definition TypeCompatibleBytes.h:24