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);
 
  198        #ifndef JPH_TSAN_ENABLED 
  200            if (mReferenceCount.fetch_sub(1, memory_order_release) == 1)
 
  203                atomic_thread_fence(memory_order_acquire);
 
  204                mJobSystem->FreeJob(
this);
 
  208            if (mReferenceCount.fetch_sub(1, memory_order_acq_rel) == 1)
 
  209                mJobSystem->FreeJob(
this);
 
  214        inline void         AddDependency(
int inCount);
 
  218        inline bool         RemoveDependency(
int inCount);
 
  222        inline void         RemoveDependencyAndQueue(
int inCount);
 
  227            intptr_t barrier = 0;
 
  228            if (mBarrier.compare_exchange_strong(barrier, 
reinterpret_cast<intptr_t
>(inBarrier), memory_order_relaxed))
 
  230            JPH_ASSERT(barrier == cBarrierDoneState, 
"A job can only belong to 1 barrier");
 
  239            if (!mNumDependencies.compare_exchange_strong(state, cExecutingState, memory_order_acquire))
 
  249            intptr_t barrier = mBarrier.load(memory_order_relaxed);
 
  252                if (mBarrier.compare_exchange_weak(barrier, cBarrierDoneState, memory_order_relaxed))
 
  258            state = cExecutingState;
 
  259            mNumDependencies.compare_exchange_strong(state, cDoneState, memory_order_relaxed);
 
  264                reinterpret_cast<Barrier *
>(barrier)->OnJobFinished(
this);
 
  270        inline bool         CanBeExecuted()
 const                       { 
return mNumDependencies.load(memory_order_relaxed) == 0; }
 
  273        inline bool         IsDone()
 const                              { 
return mNumDependencies.load(memory_order_relaxed) == cDoneState; }
 
  275    #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED) 
  277        const char *        
GetName()
 const                             { 
return mJobName; }
 
  280        static constexpr uint32 cExecutingState = 0xe0e0e0e0;           
 
  281        static constexpr uint32 cDoneState      = 0xd0d0d0d0;           
 
  283        static constexpr intptr_t cBarrierDoneState = ~intptr_t(0);     
 
  286    #if defined(JPH_EXTERNAL_PROFILE) || defined(JPH_PROFILE_ENABLED) 
  287        const char *        mJobName;                                   
 
  291        atomic<intptr_t>    mBarrier = 0;                               
 
  293        atomic<uint32>      mReferenceCount = 0;                        
 
  294        atomic<uint32>      mNumDependencies;                           
 
#define JPH_EXPORT
Definition: Core.h:236
 
unsigned int uint
Definition: Core.h:452
 
#define JPH_NAMESPACE_END
Definition: Core.h:378
 
std::uint32_t uint32
Definition: Core.h:455
 
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
 
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
 
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:31
 
#define JPH_PROFILE(...)
Definition: Profiler.h:268
 
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:277
 
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:235
 
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:225
 
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:270
 
bool IsDone() const
Test if the job finished executing.
Definition: JobSystem.h:273
 
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:107
 
Simple variable length array backed by a fixed size buffer.
Definition: StaticArray.h:14
 
const T * data() const
Definition: StaticArray.h:138
 
size_type size() const
Returns amount of elements in the array.
Definition: StaticArray.h:89