95 inline bool IsValid()
const {
return GetPtr() !=
nullptr; }
98 inline bool IsDone()
const {
return GetPtr() !=
nullptr && GetPtr()->IsDone(); }
101 inline void AddDependency(
int inCount = 1)
const { GetPtr()->AddDependency(inCount); }
105 inline void RemoveDependency(
int inCount = 1)
const { GetPtr()->RemoveDependencyAndQueue(inCount); }
108 static inline void sRemoveDependencies(
const JobHandle *inHandles,
uint inNumHandles,
int inCount = 1);
114 sRemoveDependencies(inHandles.
data(), inHandles.
size(), inCount);
177 #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
181 mJobSystem(inJobSystem),
182 mJobFunction(inJobFunction),
183 mNumDependencies(inNumDependencies)
194 mReferenceCount.fetch_add(1, memory_order_relaxed);
199 if (mReferenceCount.fetch_sub(1, memory_order_release) == 1)
202 atomic_thread_fence(memory_order_acquire);
203 mJobSystem->FreeJob(
this);
208 inline void AddDependency(
int inCount);
212 inline bool RemoveDependency(
int inCount);
216 inline void RemoveDependencyAndQueue(
int inCount);
221 intptr_t barrier = 0;
222 if (mBarrier.compare_exchange_strong(barrier,
reinterpret_cast<intptr_t
>(inBarrier), memory_order_relaxed))
224 JPH_ASSERT(barrier == cBarrierDoneState,
"A job can only belong to 1 barrier");
233 if (!mNumDependencies.compare_exchange_strong(state, cExecutingState, memory_order_acquire))
243 intptr_t barrier = mBarrier.load(memory_order_relaxed);
246 if (mBarrier.compare_exchange_weak(barrier, cBarrierDoneState, memory_order_relaxed))
252 state = cExecutingState;
253 mNumDependencies.compare_exchange_strong(state, cDoneState, memory_order_relaxed);
258 reinterpret_cast<Barrier *
>(barrier)->OnJobFinished(
this);
264 inline bool CanBeExecuted()
const {
return mNumDependencies.load(memory_order_relaxed) == 0; }
267 inline bool IsDone()
const {
return mNumDependencies.load(memory_order_relaxed) == cDoneState; }
269 #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
271 const char *
GetName()
const {
return mJobName; }
274 static constexpr uint32 cExecutingState = 0xe0e0e0e0;
275 static constexpr uint32 cDoneState = 0xd0d0d0d0;
277 static constexpr intptr_t cBarrierDoneState = ~intptr_t(0);
280 #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED)
281 const char * mJobName;
285 atomic<intptr_t> mBarrier = 0;
287 atomic<uint32> mReferenceCount = 0;
288 atomic<uint32> mNumDependencies;
#define JPH_EXPORT
Definition: Core.h:227
unsigned int uint
Definition: Core.h:439
#define JPH_NAMESPACE_END
Definition: Core.h:367
std::uint32_t uint32
Definition: Core.h:442
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:361
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:29
#define JPH_PROFILE(...)
Definition: Profiler.h:251
Class that holds an RGBA color with 8-bits per component.
Definition: Color.h:16
A job barrier keeps track of a number of jobs and allows waiting until they are all completed.
Definition: JobSystem.h:123
virtual ~Barrier()=default
Destructor, you should call JobSystem::DestroyBarrier instead of destructing this object directly.
virtual void OnJobFinished(Job *inJob)=0
Called by a Job to mark that it is finished.
virtual void AddJobs(const JobHandle *inHandles, uint inNumHandles)=0
virtual JPH_OVERRIDE_NEW_DELETE void AddJob(const JobHandle &inJob)=0
Definition: JobSystem.h:80
JobHandle()=default
Constructor.
JobHandle(Job *inJob)
Constructor, only to be used by JobSystem.
Definition: JobSystem.h:88
void RemoveDependency(int inCount=1) const
Definition: JobSystem.h:105
JobHandle(JobHandle &&inHandle) noexcept
Definition: JobSystem.h:85
bool IsDone() const
Check if this job has finished executing.
Definition: JobSystem.h:98
static void sRemoveDependencies(StaticArray< JobHandle, N > &inHandles, int inCount=1)
Helper function to remove dependencies on a static array of job handles.
Definition: JobSystem.h:112
bool IsValid() const
Check if this handle contains a job.
Definition: JobSystem.h:95
JobHandle(const JobHandle &inHandle)=default
void AddDependency(int inCount=1) const
Add to the dependency counter.
Definition: JobSystem.h:101
A class that contains information for a single unit of work.
Definition: JobSystem.h:171
const char * GetName() const
Get the name of the job.
Definition: JobSystem.h:271
void Release()
Definition: JobSystem.h:196
JPH_OVERRIDE_NEW_DELETE Job(const char *inJobName, ColorArg inColor, JobSystem *inJobSystem, const JobFunction &inJobFunction, uint32 inNumDependencies)
Constructor.
Definition: JobSystem.h:176
uint32 Execute()
Run the job function, returns the number of dependencies that this job still has or cExecutingState o...
Definition: JobSystem.h:229
bool SetBarrier(Barrier *inBarrier)
Set the job barrier that this job belongs to and returns false if this was not possible because the j...
Definition: JobSystem.h:219
JobSystem * GetJobSystem()
Get the jobs system to which this job belongs.
Definition: JobSystem.h:188
bool CanBeExecuted() const
Test if the job can be executed.
Definition: JobSystem.h:264
bool IsDone() const
Test if the job finished executing.
Definition: JobSystem.h:267
void AddRef()
Add or release a reference to this object.
Definition: JobSystem.h:191
Definition: JobSystem.h:70
virtual JobHandle CreateJob(const char *inName, ColorArg inColor, const JobFunction &inJobFunction, uint32 inNumDependencies=0)=0
virtual Barrier * CreateBarrier()=0
Create a new barrier, used to wait on jobs.
virtual void WaitForJobs(Barrier *inBarrier)=0
Wait for a set of jobs to be finished, note that only 1 thread can be waiting on a barrier at a time.
virtual void DestroyBarrier(Barrier *inBarrier)=0
Destroy a barrier when it is no longer used. The barrier should be empty at this point.
virtual void QueueJobs(Job **inJobs, uint inNumJobs)=0
Adds a number of jobs at once to the job queue.
virtual int GetMaxConcurrency() const =0
Get maximum number of concurrently executing jobs.
virtual void FreeJob(Job *inJob)=0
Frees a job.
virtual ~JobSystem()=default
Destructor.
function< void()> JobFunction
Main function of the job.
Definition: JobSystem.h:147
virtual void QueueJob(Job *inJob)=0
Adds a job to the job queue.
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition: NonCopyable.h:11
Definition: Reference.h:101
Simple variable length array backed by a fixed size buffer.
Definition: StaticArray.h:12
const T * data() const
Definition: StaticArray.h:136
size_type size() const
Returns amount of elements in the array.
Definition: StaticArray.h:87