29#ifndef _FAA_ARRAY_QUEUE_HP_H_
30#define _FAA_ARRAY_QUEUE_HP_H_
82 static constexpr long BUFFER_SIZE = 1024;
87 std::atomic<int> deqidx;
88 std::atomic<T*> items[BUFFER_SIZE];
89 std::atomic<int> enqidx;
90 std::atomic<Node*> next;
93 Node(T*
item) : deqidx{0}, enqidx{1}, next{
nullptr}
95 items[0].store(
item, std::memory_order_relaxed);
96 for (
long i = 1; i < BUFFER_SIZE; i++)
98 items[i].store(
nullptr, std::memory_order_relaxed);
102 bool casNext(Node *
cmp, Node *val)
104 return next.compare_exchange_strong(
cmp, val);
108 bool casTail(Node *
cmp, Node *val)
110 return tail.compare_exchange_strong(
cmp, val);
113 bool casHead(Node *
cmp, Node *val)
115 return head.compare_exchange_strong(
cmp, val);
123 inline static T* GetTakenPointer()
132 sentinelNode->enqidx.store(0, std::memory_order_relaxed);
162 template<
typename HazardType>
168 Node*
ltail = Hazard.Get();
169 const int idx =
ltail->enqidx.fetch_add(1);
170 if (idx > BUFFER_SIZE-1)
172 if (
ltail != tail.load())
177 if (
lnext ==
nullptr)
206 return {tail, Hazards};
211 enqueueInternal(
item, Hazard);
217 enqueueInternal(
item, Hazard);
239 template<
typename HazardType>
244 Node*
lhead = Hazard.Get();
245 if (
lhead->deqidx.load() >=
lhead->enqidx.load() &&
lhead->next.load() ==
nullptr)
249 const int idx =
lhead->deqidx.fetch_add(1);
250 if (idx > BUFFER_SIZE-1)
253 if (
lnext ==
nullptr)
260 Hazards.Delete(
lhead);
278 T*
item =
lhead->items[idx].exchange(GetTakenPointer());
293 return dequeueInternal(Hazard);
298 return {head, Hazards};
304 return dequeueInternal(Hazard);
#define checkSlow(expr)
Definition AssertionMacros.h:332
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition FAAArrayQueue.h:221
DequeueHazard & operator=(DequeueHazard &&Other)
Definition FAAArrayQueue.h:231
DequeueHazard(DequeueHazard &&Hazard)
Definition FAAArrayQueue.h:228
Definition FAAArrayQueue.h:144
EnqueueHazard & operator=(EnqueueHazard &&Other)
Definition FAAArrayQueue.h:154
EnqueueHazard(EnqueueHazard &&Hazard)
Definition FAAArrayQueue.h:151
Definition FAAArrayQueue.h:81
void enqueue(T *item)
Definition FAAArrayQueue.h:214
EnqueueHazard getTailHazard()
Definition FAAArrayQueue.h:204
void enqueue(T *item, EnqueueHazard &Hazard)
Definition FAAArrayQueue.h:209
T * dequeue()
Definition FAAArrayQueue.h:301
~FAAArrayQueue()
Definition FAAArrayQueue.h:137
FAAArrayQueue()
Definition FAAArrayQueue.h:129
T * dequeue(DequeueHazard &Hazard)
Definition FAAArrayQueue.h:291
DequeueHazard getHeadHazard()
Definition FAAArrayQueue.h:296
Definition HazardPointer.h:58
Definition HazardPointer.h:245