13template<
typename LAMBDA>
25 template<
typename...
ARGS>
31 template<
typename...
ARGS>
38template<
typename LAMBDA>
44template<
typename TaskType>
52 std::atomic_int ActiveWorkers {0};
53 std::atomic_bool CheckDone {
false};
58 check(ActiveWorkers == 0);
75 Priority = ActiveTask->GetPriority();
91 InternalData =
new FInternalData();
99 check(!InternalData->CheckDone.load(std::memory_order_relaxed));
100 InternalData->TaskQueue.enqueue(
NewWork);
105 check(!InternalData->CheckDone.load(std::memory_order_relaxed));
106 check(DoWork !=
nullptr);
114 TaskHandle->Init(
TEXT(
"TLocalWorkQueue::AddWorkers"),
Priority, [
LocalDoWork, InternalData = InternalData, TaskHandle]()
117 InternalData->ActiveWorkers.fetch_add(1, std::memory_order_acquire);
118 while (TaskType* Work = InternalData->TaskQueue.dequeue())
120 check(!InternalData->CheckDone.load(std::memory_order_relaxed));
121 (*LocalDoWork)(Work);
123 if (InternalData->ActiveWorkers.fetch_sub(1, std::memory_order_release) == 1)
125 InternalData->FinishedEvent.Notify();
140 bool bNoActiveWorkers = InternalData->ActiveWorkers.load(std::memory_order_acquire) == 0;
141 if (TaskType* Work = InternalData->TaskQueue.dequeue())
145 else if (
bNoActiveWorkers && InternalData->ActiveWorkers.load(std::memory_order_acquire) == 0)
151 auto Token = InternalData->FinishedEvent.PrepareWait();
152 if (InternalData->ActiveWorkers.load(std::memory_order_acquire) == 0)
158 InternalData->FinishedEvent.Wait(Token);
162 InternalData->CheckDone.store(
true);
163 check(InternalData->TaskQueue.dequeue() ==
nullptr);
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define check(expr)
Definition AssertionMacros.h:314
#define verify(expr)
Definition AssertionMacros.h:319
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
constexpr auto MakeYCombinator(LAMBDA &&Lambda)
Definition LocalWorkQueue.h:39
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition FAAArrayQueue.h:81
T * dequeue(DequeueHazard &Hazard)
Definition FAAArrayQueue.h:291
Definition RefCounting.h:283
static CORE_API const FTask * GetActiveTask()
Definition Scheduler.cpp:656
Definition ConcurrentLinearAllocator.h:571
Definition AssetRegistryState.h:50
Definition LocalWorkQueue.h:46
TLocalWorkQueue(TaskType *InitialWork, LowLevelTasks::ETaskPriority InPriority=LowLevelTasks::ETaskPriority::Count)
Definition LocalWorkQueue.h:68
void AddTask(TaskType *NewWork)
Definition LocalWorkQueue.h:97
void AddWorkers(uint16 NumWorkers)
Definition LocalWorkQueue.h:103
void Run(TFunctionRef< void(TaskType *)> InDoWork)
Definition LocalWorkQueue.h:132
Definition RefCounting.h:454
Definition SharedPointer.h:692
Definition LocalWorkQueue.h:15
constexpr auto operator()(ARGS &&... Args) -> decltype(Lambda(static_cast< TYCombinator< LAMBDA > & >(*this), Forward< ARGS >(Args)...))
Definition LocalWorkQueue.h:32
constexpr TYCombinator(const LAMBDA &InLambda)
Definition LocalWorkQueue.h:22
constexpr TYCombinator(LAMBDA &&InLambda)
Definition LocalWorkQueue.h:19
constexpr auto operator()(ARGS &&... Args) const -> decltype(Lambda(static_cast< const TYCombinator< LAMBDA > & >(*this), Forward< ARGS >(Args)...))
Definition LocalWorkQueue.h:26
ETaskPriority
Definition Task.h:18
U16 Index
Definition radfft.cpp:71