24 template<
typename T,
typename AllocatorType = FMemory>
25 class UE_DEPRECATED(5.3,
"This concurrent queue was deprecated because it uses spin-waiting that can cause priority inversion and subsequently deadlocks on some platforms. Please use TConsumeAllMpmcQueue.")
TDepletableMpmcQueue final
30 std::atomic<FNode*>
Next{
nullptr };
35 std::atomic<FNode*> Tail{ &Sentinel };
44 static_assert(std::is_trivially_destructible_v<FNode>);
47 FNode* Node = Sentinel.Next.load(std::memory_order_relaxed);
48 while (Node !=
nullptr)
51 FNode*
Next = Node->Next.load(std::memory_order_relaxed);
52 AllocatorType::Free(Node);
66 FNode*
New = ::new(AllocatorType::Malloc(
sizeof(FNode),
alignof(FNode))) FNode;
72 FNode* Prev = Tail.exchange(
New, std::memory_order_acq_rel);
79 Prev->Next.store(
New, std::memory_order_relaxed);
81 return Prev == &Sentinel;
92 FNode*
First = Sentinel.Next.exchange(
nullptr, std::memory_order_relaxed);
101 FNode*
Last = Tail.exchange(&Sentinel, std::memory_order_acq_rel);
103 check(
Last->Next.load(std::memory_order_relaxed) ==
nullptr);
113 return Tail.load(std::memory_order_relaxed) == &Sentinel;
120 auto GetNext = [](FNode* Node)
122 FNode*
Next =
nullptr;
124 while (
Next ==
nullptr)
126 Next = Node->Next.load(std::memory_order_relaxed);
131 auto Consume = [&Consumer](FNode* Node)
133 T* ValuePtr = (T*)&Node->Value;
136 AllocatorType::Free(Node);
151 template<
typename T,
typename AllocatorType = FMemory>
152 using TDepletableMpscQueue
UE_DEPRECATED(5.2,
"This concurrent queue was deprecated because it uses spin-waiting that can cause priority inversion and subsequently deadlocks on some platforms. Please use TConsumeAllMpmcQueue.") =
TDepletableMpmcQueue<T, AllocatorType>;
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
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 AdvancedWidgetsModule.cpp:13
Definition TypeCompatibleBytes.h:24