11#define LOWLEVEL_TASK_SIZE PLATFORM_CACHE_LINE_SIZE
41 TEXT(
"BackgroundHigh"),
42 TEXT(
"BackgroundNormal"),
131 Count = (1 << 6) - 1,
151 template<
typename Type,
void (Type::*DeleteFunction)()>
164 Other.Value =
nullptr;
176 (Value->*DeleteFunction)();
190 class FPackedDataAtomic;
192 friend class ::LowLevelTasks::FTask;
207 friend class FTaskBase::FPackedDataAtomic;
211 constexpr FPackedData()
235 static_assert(
sizeof(FPackedData) ==
sizeof(
uintptr_t),
"Packed data needs to be pointer size");
243 inline const TCHAR* GetDebugName()
const
245 return reinterpret_cast<const TCHAR*
>(DebugName);
264 class FPackedDataAtomic
266 std::atomic<uintptr_t> PackedData { FPackedData().PackedData };
274 bool compare_exchange_strong(FPackedData& Expected, FPackedData
Desired, std::memory_order
Success, std::memory_order
Failure)
276 return PackedData.compare_exchange_strong(Expected.PackedData,
Desired.PackedData,
Success,
Failure);
279 bool compare_exchange_strong(FPackedData& Expected, FPackedData
Desired, std::memory_order Order)
281 return PackedData.compare_exchange_strong(Expected.PackedData,
Desired.PackedData, Order);
284 FPackedData load(std::memory_order Order)
const
286 return PackedData.load(Order);
289 void store(
const FPackedData& Expected, std::memory_order Order)
291 PackedData.store(Expected.PackedData, Order);
297 FTaskDelegate Runnable;
298 mutable void* UserData =
nullptr;
299 FPackedDataAtomic PackedData;
302 FTaskBase() =
default;
314 static thread_local FTask* ActiveTask;
321 inline bool IsCompleted(std::memory_order MemoryOrder = std::memory_order_seq_cst)
const
323 ETaskState State = PackedData.load(MemoryOrder).GetState();
332 ETaskState State = PackedData.load(std::memory_order_relaxed).GetState();
341 ETaskState State = PackedData.load(std::memory_order_acquire).GetState();
347 inline bool WasCanceledOrIsExpediting()
const
349 ETaskState State = PackedData.load(std::memory_order_relaxed).GetState();
359 ETaskState State = PackedData.load(std::memory_order_relaxed).GetState();
363#if PLATFORM_DESKTOP || !IS_MONOLITHIC
402 template<
typename TRunnable>
405 template<
typename TRunnable>
430 inline static bool PermitBackgroundWork()
432 return ActiveTask && ActiveTask->IsBackgroundTask();
435 inline bool TryPrepareLaunch();
437 template<
bool bIsExpeditingThread>
438 inline void TryFinish();
440 inline FTask* ExecuteTask();
450 return PackedData.load(std::memory_order_relaxed).GetPriority();
474 template<
typename TRunnable>
481 if constexpr (std::is_same_v<FTask*, decltype(UE::Core::Private::IsInvocable::DeclVal<TRunnable>()())>)
508 template<
typename TRunnable>
519 inline bool FTask::TryPrepareLaunch()
529 FPackedData
LocalPackedData = PackedData.load(std::memory_order_relaxed);
547 FPackedData
LocalPackedData = PackedData.load(std::memory_order_relaxed);
562 if(TryPrepareLaunch())
578 template<
bool bIsExpeditingThread>
579 inline void FTask::TryFinish()
582 ETaskState PreviousState = PackedData.fetch_or(NextState, std::memory_order_acq_rel);
599 FPackedData
LocalPackedData = PackedData.load(std::memory_order_relaxed);
618 inline FTask* FTask::ExecuteTask()
644 return PackedData.load(std::memory_order_relaxed).GetDebugName();
664 FPackedData
LocalPackedData = PackedData.load(std::memory_order_relaxed);
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define verifySlow(expr)
Definition AssertionMacros.h:334
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define LOWLEVEL_TASK_SIZE
Definition Task.h:11
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
UE_FORCEINLINE_HINT uint64 GetState() const
Definition LockFreeList.h:46
void Init()
Definition LockFreeList.h:4
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
const bool
Definition NetworkReplayStreaming.h:178
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Definition Scheduler.h:103
void * GetUserData() const
Definition Task.h:422
void Init(const TCHAR *InDebugName, ETaskPriority InPriority, TRunnable &&InRunnable, ETaskFlags Flags=ETaskFlags::DefaultFlags)
Definition Task.h:475
bool AllowBusyWaiting() const
Definition Task.h:652
FInitData GetInitData() const
Definition Task.h:662
void SetUserData(void *NewUserData) const
Definition Task.h:423
bool WasExpedited() const
Definition Task.h:339
bool AllowCancellation() const
Definition Task.h:657
~FTask()
Definition Task.h:514
static CORE_API const FTask * GetActiveTask()
Definition Scheduler.cpp:656
bool TryExpedite()
Definition Task.h:610
bool TryCancel(ECancellationFlags CancellationFlags=ECancellationFlags::DefaultFlags)
Definition Task.h:524
bool IsCompleted(std::memory_order MemoryOrder=std::memory_order_seq_cst) const
Definition Task.h:321
ETaskPriority GetPriority() const
Definition Task.h:448
const TCHAR * GetDebugName() const
Definition Task.h:642
bool WasCanceled() const
Definition Task.h:330
bool IsReady() const
Definition Task.h:357
bool TryExecute()
Definition Task.h:570
bool TryRevive()
Definition Task.h:545
bool IsBackgroundTask() const
Definition Task.h:647
~TDeleter()
Definition Task.h:172
Type * operator->() const
Definition Task.h:167
TDeleter(const TDeleter &)=delete
TDeleter(Type *InValue)
Definition Task.h:157
TDeleter(TDeleter &&Other)
Definition Task.h:162
friend class ::LowLevelTasks::FTask
Definition Task.h:192
uint32 GetFlags(uint32 Word3)
Definition CollisionFilterData.cpp:21
Definition Scheduler.cpp:25
ECancellationFlags
Definition Task.h:84
ETaskPriority
Definition Task.h:18
bool ToTaskPriority(const TCHAR *PriorityStr, ETaskPriority &OutPriority)
Definition Task.h:48
ETaskState
Definition Task.h:123
ETaskFlags
Definition Task.h:93
State
Definition PacketHandler.h:88
ETaskPriority Priority
Definition Task.h:417
ETaskFlags Flags
Definition Task.h:418
const TCHAR * DebugName
Definition Task.h:416
static UE_FORCEINLINE_HINT int32 Stricmp(const CharType *String1, const CharType *String2)
Definition CString.h:1030