Plasma Engine  2.0
Loading...
Searching...
No Matches
TaskSystem.h
1#pragma once
2
3#include <Foundation/Containers/DynamicArray.h>
4#include <Foundation/Containers/List.h>
5#include <Foundation/Threading/Implementation/Task.h>
6#include <Foundation/Threading/Mutex.h>
7#include <Foundation/Types/SharedPtr.h>
8
24class PL_FOUNDATION_DLL plTaskSystem
25{
26public:
29
30public:
33 static plTaskGroupID StartSingleTask(const plSharedPtr<plTask>& pTask, plTaskPriority::Enum priority,
35
38 static plTaskGroupID StartSingleTask(const plSharedPtr<plTask>& pTask, plTaskPriority::Enum priority, plTaskGroupID dependency,
40
57 static void FinishFrameTasks(); // [tested]
58
75 static plResult CancelTask(const plSharedPtr<plTask>& pTask, plOnTaskRunning::Enum onTaskRunning = plOnTaskRunning::WaitTillFinished); // [tested]
76
77 struct TaskData
78 {
79 plSharedPtr<plTask> m_pTask;
80 plTaskGroup* m_pBelongsToGroup = nullptr;
81 plUInt32 m_uiInvocation = 0;
82 };
83
84private:
86 static TaskData GetNextTask(plTaskPriority::Enum FirstPriority, plTaskPriority::Enum LastPriority, bool bOnlyTasksThatNeverWait,
87 const plTaskGroupID& WaitingForGroup, plAtomicInteger32* pWorkerState);
88
90 static bool ExecuteTask(plTaskPriority::Enum FirstPriority, plTaskPriority::Enum LastPriority, bool bOnlyTasksThatNeverWait,
91 const plTaskGroupID& WaitingForGroup, plAtomicInteger32* pWorkerState);
92
94 static void TaskHasFinished(plSharedPtr<plTask>&& pTask, plTaskGroup* pGroup);
95
97 static void ReprioritizeFrameTasks();
98
100 static void ExecuteSomeFrameTasks(plTime smoothFrameTime);
101
102
104 static bool HelpExecutingTasks(const plTaskGroupID& WaitingForGroup);
105
107
110
111public:
117 static plTaskGroupID CreateTaskGroup(
119
121 static void AddTaskToGroup(plTaskGroupID group, const plSharedPtr<plTask>& pTask); // [tested]
122
131 static void AddTaskGroupDependency(plTaskGroupID group, plTaskGroupID dependsOn); // [tested]
132
134 static void AddTaskGroupDependencyBatch(plArrayPtr<const plTaskGroupDependency> batch);
135
137 static void StartTaskGroup(plTaskGroupID group); // [tested]
138
140 static void StartTaskGroupBatch(plArrayPtr<const plTaskGroupID> batch);
141
146 static bool IsTaskGroupFinished(plTaskGroupID group); // [tested]
147
154 static plResult CancelGroup(plTaskGroupID group, plOnTaskRunning::Enum onTaskRunning = plOnTaskRunning::WaitTillFinished); // [tested]
155
161 static void WaitForGroup(plTaskGroupID group); // [tested]
162
170 static void WaitForCondition(plDelegate<bool()> condition);
171
172private:
174 static void ScheduleGroupTasks(plTaskGroup* pGroup, bool bHighPriority);
175
177 static void DependencyHasFinished(plTaskGroup* pGroup);
178
180
183
184public:
196 static void SetWorkerThreadCount(plInt32 iShortTasks = -1, plInt32 iLongTasks = -1); // [tested]
197
199 static plUInt32 GetWorkerThreadCount(plWorkerThreadType::Enum type);
200
206 static plUInt32 GetNumAllocatedWorkerThreads(plWorkerThreadType::Enum type);
207
209 static plWorkerThreadType::Enum GetCurrentThreadWorkerType();
210
215 static double GetThreadUtilization(plWorkerThreadType::Enum type, plUInt32 uiThreadIndex, plUInt32* pNumTasksExecuted = nullptr);
216
218 static void WakeUpThreads(plWorkerThreadType::Enum type, plUInt32 uiNumThreads);
219
220private:
221 friend class plTaskWorkerThread;
222
224 static void AllocateThreads(plWorkerThreadType::Enum type, plUInt32 uiAddThreads);
225
227 static void StopWorkerThreads();
228
230 static void DetermineTasksToExecuteOnThread(plTaskPriority::Enum& out_FirstPriority, plTaskPriority::Enum& out_LastPriority);
231
232private:
233 static plUniquePtr<plTaskSystemThreadState> s_pThreadState;
234
236
239
240public:
242 static void ParallelForIndexed(plUInt32 uiStartIndex, plUInt32 uiNumItems, plParallelForIndexedFunction32 taskCallback,
243 const char* szTaskName = nullptr, plTaskNesting taskNesting = plTaskNesting::Never, const plParallelForParams& params = plParallelForParams());
244
246 static void ParallelForIndexed(plUInt64 uiStartIndex, plUInt64 uiNumItems, plParallelForIndexedFunction64 taskCallback,
247 const char* szTaskName = nullptr, plTaskNesting taskNesting = plTaskNesting::Never, const plParallelForParams& params = plParallelForParams());
248
253 template <typename ElemType, typename Callback>
254 static void ParallelFor(
255 plArrayPtr<ElemType> taskItems, Callback taskCallback, const char* szTaskName = nullptr, const plParallelForParams& params = plParallelForParams());
261 template <typename ElemType, typename Callback>
262 static void ParallelForSingle(
263 plArrayPtr<ElemType> taskItems, Callback taskCallback, const char* szTaskName = nullptr, const plParallelForParams& params = plParallelForParams());
269 template <typename ElemType, typename Callback>
270 static void ParallelForSingleIndex(
271 plArrayPtr<ElemType> taskItems, Callback taskCallback, const char* szTaskName = nullptr, const plParallelForParams& params = plParallelForParams());
272
273private:
274 template <typename ElemType>
275 static void ParallelForInternal(
276 plArrayPtr<ElemType> taskItems, plParallelForFunction<ElemType> taskCallback, const char* taskName, const plParallelForParams& params);
277
279
282
283public:
285 static void WriteStateSnapshotToDGML(plDGMLGraph& ref_graph);
286
289 static void WriteStateSnapshotToFile(const char* szPath = nullptr);
290
291private:
293
296
297public:
301 static void SetTargetFrameTime(plTime targetFrameTime = plTime::MakeFromSeconds(1.0 / 40.0) /* 40 FPS -> 25 ms */);
302
303private:
304 PL_MAKE_SUBSYSTEM_STARTUP_FRIEND(Foundation, TaskSystem);
305
306 static void Startup();
307 static void Shutdown();
308
309private:
311 static plMutex s_TaskSystemMutex;
312
313 static plUniquePtr<plTaskSystemState> s_pState;
314
316};
317
318#include <Foundation/Threading/Implementation/ParallelFor_inl.h>
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
This class encapsulates building a DGML compatible graph.
Definition DGMLWriter.h:10
Provides a simple mechanism for mutual exclusion to prevent multiple threads from accessing a shared ...
Definition Mutex.h:13
A Shared ptr manages a shared object and destroys that object when no one references it anymore....
Definition SharedPtr.h:10
Definition TaskGroup.h:11
Given out by plTaskSystem::CreateTaskGroup to identify a task group.
Definition TaskSystemDeclarations.h:103
This system allows to automatically distribute tasks onto a number of worker threads.
Definition TaskSystem.h:25
Definition TaskWorkerThread.h:10
A Unique ptr manages an object and destroys that object when it goes out of scope....
Definition UniquePtr.h:10
Settings for plTaskSystem::ParallelFor invocations.
Definition TaskSystemDeclarations.h:167
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
Enum
Definition TaskSystemDeclarations.h:41
Definition TaskSystem.h:78
The time class encapsulates a double value storing the time in seconds.
Definition Time.h:12
PL_ALWAYS_INLINE static constexpr plTime MakeFromSeconds(double fSeconds)
Creates an instance of plTime that was initialized from seconds.
Definition Time.h:30
Enum
Definition TaskSystemDeclarations.h:89