9#include "Containers/Array.h"
10#include "Containers/Map.h"
97 return TEXT(
"FScheduledWork");
121 uint32 Release()
const override
135 uint32 GetRefCount()
const override
142 check(GetRefCount() == 0);
151 void Abandon()
override
163 int64 GetRequiredMemory()
const override
212 CORE_API void Schedule(FScheduledWork* Work =
nullptr);
213 CORE_API void ReleaseWorkNoLock(FScheduledWork* Work);
221 std::atomic<int32> MaxConcurrency;
222 int32 MaxTaskToSchedule;
223 std::atomic<int32> CurrentConcurrency;
225 bool bIsScheduling =
false;
301 check(bIsExiting ==
false);
324 if (--TaskCount == 0 && bIsExiting)
330 int32 GetNumThreads()
const override
346 return DesiredThread;
379 virtual bool Retract()
381 return Task.TryCancel();
398 void*
operator new(
size_t size)
400 return FMemory::Malloc(size, 128);
403 void operator delete(
void* ptr)
423 FQueuedWorkInternalData* QueuedWork = Dequeue();
428 TaskCount.fetch_add(1, std::memory_order_acquire);
446 FQueuedWorkInternalData* QueuedWork = Dequeue();
450 TaskCount.fetch_add(1, std::memory_order_acquire);
460 void FinalizeExecution()
462 if (TaskCount.fetch_sub(1, std::memory_order_release) == 1 && bIsExiting)
475 check(bIsExiting ==
false);
487 FMemMark Mark(FMemStack::Get());
488 InQueuedWork->DoThreadedWork();
493 TaskCount.fetch_add(1, std::memory_order_acquire);
504 bool bCancelled =
false;
516 int32 GetNumThreads()
const override
533 FQueuedWorkInternalData* QueuedWork = Dequeue();
539 verify(QueuedWork->Retract());
553 inline FQueuedWorkInternalData* Dequeue()
557 FQueuedWorkInternalData* QueuedWork = PendingWork[i].
dequeue();
574 std::atomic_uint TaskCount{0};
575 std::atomic_bool bIsExiting{
false};
576 std::atomic_bool bIsPaused{
false};
#define check(expr)
Definition AssertionMacros.h:314
#define verifySlow(expr)
Definition AssertionMacros.h:334
#define verify(expr)
Definition AssertionMacros.h:319
#define QUICK_USE_CYCLE_STAT(StatId, GroupId)
Definition Stats.h:668
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
EQueuedWorkFlags
Definition IQueuedWork.h:10
constexpr auto DefaultQueuedWorkPriorityWrapper
Definition QueuedThreadPoolWrapper.h:36
EQueuedWorkPriority
Definition QueuedThreadPool.h:14
Definition FAAArrayQueue.h:81
void enqueue(T *item, EnqueueHazard &Hazard)
Definition FAAArrayQueue.h:209
T * dequeue(DequeueHazard &Hazard)
Definition FAAArrayQueue.h:291
Definition ExecutionResource.h:29
Definition MemStack.h:506
Definition QueuedThreadPoolWrapper.h:373
void Destroy() override
Definition QueuedThreadPoolWrapper.h:527
bool Create(uint32 InNumQueuedThreads, uint32 InStackSize, EThreadPriority InThreadPriority, const TCHAR *InName) override
Definition QueuedThreadPoolWrapper.h:522
void Pause()
Definition QueuedThreadPoolWrapper.h:411
~FQueuedLowLevelThreadPool()
Definition QueuedThreadPoolWrapper.h:393
void Resume(int32 InNumQueuedWork=-1)
Definition QueuedThreadPoolWrapper.h:419
FQueuedLowLevelThreadPool(TFunction< EQueuedWorkPriority(EQueuedWorkPriority)> InPriorityMapper=DefaultQueuedWorkPriorityWrapper, LowLevelTasks::FScheduler *InScheduler=&LowLevelTasks::FScheduler::Get())
Definition QueuedThreadPoolWrapper.h:388
Definition QueuedThreadPoolWrapper.h:234
FQueuedThreadPoolDynamicWrapper(FQueuedThreadPool *InWrappedQueuedThreadPool, int32 InMaxConcurrency=-1, TFunction< EQueuedWorkPriority(EQueuedWorkPriority)> InPriorityMapper=DefaultQueuedWorkPriorityWrapper)
Definition QueuedThreadPoolWrapper.h:241
void Sort(TFunctionRef< bool(const IQueuedWork *Lhs, const IQueuedWork *Rhs)> Predicate)
Definition QueuedThreadPoolWrapper.h:255
void AddQueuedWork(IQueuedWork *InQueuedWork, EQueuedWorkPriority InPriority=EQueuedWorkPriority::Normal) override
Definition QueuedThreadPoolWrapper.h:246
Definition QueuedThreadPoolWrapper.h:265
~FQueuedThreadPoolTaskGraphWrapper()
Definition QueuedThreadPoolWrapper.h:294
void Destroy() override
Definition QueuedThreadPoolWrapper.h:354
FQueuedThreadPoolTaskGraphWrapper(ENamedThreads::Type InDesiredThread)
Definition QueuedThreadPoolWrapper.h:287
FQueuedThreadPoolTaskGraphWrapper(TFunction< ENamedThreads::Type(EQueuedWorkPriority)> InPriorityMapper=nullptr)
Definition QueuedThreadPoolWrapper.h:270
bool Create(uint32 InNumQueuedThreads, uint32 StackSize, EThreadPriority ThreadPriority, const TCHAR *Name) override
Definition QueuedThreadPoolWrapper.h:349
Definition QueuedThreadPoolWrapper.h:76
virtual void DoThreadedWork() override
Definition QueuedThreadPoolWrapper.h:101
CORE_API FScheduledWork()
Definition QueuedThreadPoolWrapper.cpp:20
IQueuedWork * Work
Definition QueuedThreadPoolWrapper.h:187
FScheduledWork(const FScheduledWork &)=delete
CORE_API ~FScheduledWork() override
Definition QueuedThreadPoolWrapper.cpp:25
const TCHAR * GetDebugName() const final
Definition QueuedThreadPoolWrapper.h:88
FScheduledWork & operator=(const FScheduledWork &&)=delete
FScheduledWork(const FScheduledWork &&)=delete
FScheduledWork & operator=(const FScheduledWork &)=delete
Definition QueuedThreadPoolWrapper.h:44
CORE_API ~FQueuedThreadPoolWrapper()
Definition QueuedThreadPoolWrapper.cpp:40
CORE_API void AddQueuedWork(IQueuedWork *InQueuedWork, EQueuedWorkPriority InPriority=EQueuedWorkPriority::Normal) override
Definition QueuedThreadPoolWrapper.cpp:124
virtual int32 GetMaxConcurrency() const
Definition QueuedThreadPoolWrapper.h:197
virtual void OnScheduled(const IQueuedWork *)
Definition QueuedThreadPoolWrapper.h:200
virtual void OnUnscheduled(const IQueuedWork *)
Definition QueuedThreadPoolWrapper.h:203
CORE_API bool RetractQueuedWork(IQueuedWork *InQueuedWork) override
Definition QueuedThreadPoolWrapper.cpp:134
CORE_API int32 GetNumThreads() const override
Definition QueuedThreadPoolWrapper.cpp:160
virtual FScheduledWork * AllocateScheduledWork()
Definition QueuedThreadPoolWrapper.h:206
CORE_API void SetMaxConcurrency(int32 MaxConcurrency=-1)
Definition QueuedThreadPoolWrapper.cpp:100
CORE_API void Pause()
Definition QueuedThreadPoolWrapper.cpp:108
FCriticalSection Lock
Definition QueuedThreadPoolWrapper.h:193
int32 GetCurrentConcurrency() const
Definition QueuedThreadPoolWrapper.h:72
FThreadPoolPriorityQueue QueuedWork
Definition QueuedThreadPoolWrapper.h:194
Definition QueuedThreadPool.h:105
Definition ScopeLock.h:141
static CORE_API FTaskGraphInterface & Get()
Definition TaskGraph.cpp:1794
virtual int32 GetNumWorkerThreads()=0
Definition QueuedThreadPool.h:53
CORE_API void Sort(EQueuedWorkPriority InPriorityBucket, TFunctionRef< bool(const IQueuedWork *A, const IQueuedWork *B)> Predicate)
Definition ThreadingBase.cpp:1035
Definition ThreadSafeCounter.h:14
int32 Increment()
Definition ThreadSafeCounter.h:52
int32 Decrement()
Definition ThreadSafeCounter.h:75
int32 GetValue() const
Definition ThreadSafeCounter.h:120
Definition ExecutionResource.h:10
Definition IQueuedWork.h:35
Definition IQueuedWork.h:62
virtual int64 GetRequiredMemory() const
Definition IQueuedWork.h:86
virtual void DoThreadedWork()=0
virtual EQueuedWorkFlags GetQueuedWorkFlags() const
Definition IQueuedWork.h:81
virtual const TCHAR * GetDebugName() const
Definition IQueuedWork.h:94
Definition Scheduler.h:103
bool TryLaunch(FTask &Task, EQueuePreference QueuePreference=EQueuePreference::DefaultPreference, bool bWakeUpWorker=true)
Definition Scheduler.h:189
uint32 GetNumWorkers() const
Definition Scheduler.h:199
static FScheduler & Get()
Definition Scheduler.h:215
Definition ConcurrentLinearAllocator.h:571
Definition AssetRegistryState.h:50
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
static FORCEINLINE FMemStack & Get()
Definition ThreadSingleton.h:101
Definition ManualResetEvent.h:15
void Notify()
Definition ManualResetEvent.h:83
void Wait()
Definition ManualResetEvent.h:33
Type
Definition TaskGraphInterfaces.h:57
@ AnyBackgroundThreadNormalTask
Definition TaskGraphInterfaces.h:106
@ AnyHiPriThreadNormalTask
Definition TaskGraphInterfaces.h:100
@ AnyNormalThreadNormalTask
Definition TaskGraphInterfaces.h:103
Definition Scheduler.cpp:25
ETaskPriority
Definition Task.h:18
ETaskFlags
Definition Task.h:93
int
Definition TestServer.py:515
static FGraphEventRef CreateAndDispatchWhenReady(TUniqueFunction< void()> InFunction, TStatId InStatId=TStatId{}, const FGraphEventArray *InPrerequisites=nullptr, ENamedThreads::Type InDesiredThread=ENamedThreads::AnyThread)
Definition TaskGraphInterfaces.h:1128
static FORCENOINLINE CORE_API void Free(void *Original)
Definition UnrealMemory.cpp:685
Definition RefCounting.h:29