25 if (Head.load(std::memory_order_relaxed) ==
nullptr)
30 FNode* Tail = Sentinel.Next.load(std::memory_order_relaxed);
31 while (Tail !=
nullptr)
33 FNode*
Next = Tail->Next.load(std::memory_order_relaxed);
46 FNode* Prev = Head.load(std::memory_order_acquire);
52 FNode*
New =
new FNode;
55 while (!Head.compare_exchange_weak(Prev,
New, std::memory_order_release) && Prev !=
nullptr)
66 Prev->Next.store(
New, std::memory_order_release);
79 FNode* Tail = &Sentinel;
82 FNode*
const Head_Local = Head.exchange(
nullptr, std::memory_order_acq_rel);
93 return Head.load(std::memory_order_relaxed) ==
nullptr;
99 std::atomic<FNode*>
Next{
nullptr };
104 std::atomic<FNode*> Head{ &Sentinel };
108 static void Close_NonMember(FNode* Head, FNode* Tail,
const F& Consumer)
110 if (Head == Tail || Head ==
nullptr )
121 Next = Node->Next.load(std::memory_order_relaxed);
122 }
while (
Next ==
nullptr);
130 auto Consume = [&Consumer](FNode* Node)
132 T* ValuePtr = (T*)&Node->Value;
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 ClosableMpscQueue.h:17
bool Close(const F &Consumer)
Definition ClosableMpscQueue.h:77
TClosableMpscQueue()=default
~TClosableMpscQueue()
Definition ClosableMpscQueue.h:23
bool IsClosed() const
Definition ClosableMpscQueue.h:91
UE_NONCOPYABLE(TClosableMpscQueue)
bool Enqueue(ArgTypes &&... Args)
Definition ClosableMpscQueue.h:44
uint32 GetNext(uint32 Index, const IndexType *NextIndexData, const uint32 NextIndexCount)
Definition CompactHashTable.h:116
Definition TypeCompatibleBytes.h:24