Foundation
Loading...
Searching...
No Matches
Public Member Functions | Private Types | Private Member Functions | Static Private Member Functions | Private Attributes | Friends | List of all members
Foundation::Core::JobSystem Class Reference

#include <JobSystem.hpp>

Public Member Functions

 JobSystem (JobSystemDesc const &desc)
 
 JobSystem (JobSystem const &)=delete
 
JobSystemoperator= (JobSystem const &)=delete
 
 ~JobSystem ()
 
size_t GetWorkerCount () const noexcept
 
size_t GetMaxConcurrency () const noexcept
 
template<typename Fn >
JobHandle CreateJob (StringView name, JobPriority priority, Fn &&function, uint32_t dependencyCount=0)
 
template<typename Fn >
JobHandle CreateJob (StringView name, Fn &&function, uint32_t dependencyCount=0)
 
template<typename Fn >
JobHandle CreateJobAfter (StringView name, JobPriority priority, Span< const JobHandle > prerequisites, Fn &&function)
 
template<typename Fn >
JobHandle CreateJobAfter (StringView name, Span< const JobHandle > prerequisites, Fn &&function)
 
JobBarrier CreateBarrier ()
 
void Wait (JobBarrier &barrier)
 
void Wait (JobBarrier &&barrier)
 
void Cancel (JobHandle const &job)
 
void Join ()
 
void Shutdown ()
 
template<typename Fn >
JobHandle Dispatch (StringView name, size_t count, size_t step, JobPriority priority, Fn &&function)
 
template<typename Fn >
JobBarrier ParallelFor (StringView name, size_t count, size_t step, Fn &&function)
 

Private Types

using ReadyQueue = MPMCQueue< JobHandle >
 
using ReadyQueues = Array< ReadyQueue, kJobPriorityCount >
 

Private Member Functions

bool BeginSubmit () noexcept
 
void EndSubmit () noexcept
 
JobHandle CreateJobInternal (StringView name, JobPriority priority, UniquePtr< JobCallable > callable, uint32_t dependencyCount)
 
void Queue (JobHandle const &job) noexcept
 
void ReleaseDependency (JobHandle const &job, uint32_t count, bool prerequisiteFailed)
 
void Finish (JobHandle const &job, JobStatus status) noexcept
 
void RegisterSuccessor (JobHandle const &prerequisite, JobHandle const &dependent)
 
bool TryExecuteOne (size_t workerId)
 
void WorkerMain (size_t workerId)
 
void ReleaseBarrier () noexcept
 
void CancelInternal (JobHandle const &job)
 

Static Private Member Functions

static constexpr size_t PriorityIndex (JobPriority priority) noexcept
 

Private Attributes

AllocatormAllocator
 
String mName
 
size_t mMaxBarriers
 
SharedPtr< JobPoolmPool
 
Atomic< bool > mAccepting {true}
 
Mutex mSubmitMutex
 
CondVar mSubmitCV
 
size_t mSubmitting {}
 
Atomic< bool > mStopping {false}
 
Atomic< bool > mStopped {false}
 
Atomic< size_t > mWakeEpoch {0}
 
Atomic< size_t > mOutstanding {0}
 
Mutex mCallerMutex
 
ReadyQueues mReady
 
Vector< ThreadmThreads
 

Friends

class JobHandle
 
class JobBarrier
 
class JobDependency
 

Member Typedef Documentation

◆ ReadyQueue

◆ ReadyQueues

Constructor & Destructor Documentation

◆ JobSystem() [1/2]

Foundation::Core::JobSystem::JobSystem ( JobSystemDesc const &  desc)
explicit

◆ JobSystem() [2/2]

Foundation::Core::JobSystem::JobSystem ( JobSystem const &  )
delete

◆ ~JobSystem()

Foundation::Core::JobSystem::~JobSystem ( )

Member Function Documentation

◆ BeginSubmit()

bool Foundation::Core::JobSystem::BeginSubmit ( )
privatenoexcept

◆ Cancel()

void Foundation::Core::JobSystem::Cancel ( JobHandle const &  job)

◆ CancelInternal()

void Foundation::Core::JobSystem::CancelInternal ( JobHandle const &  job)
private

◆ CreateBarrier()

JobBarrier Foundation::Core::JobSystem::CreateBarrier ( )

◆ CreateJob() [1/2]

template<typename Fn >
JobHandle Foundation::Core::JobSystem::CreateJob ( StringView  name,
Fn &&  function,
uint32_t  dependencyCount = 0 
)
inline

◆ CreateJob() [2/2]

template<typename Fn >
JobHandle Foundation::Core::JobSystem::CreateJob ( StringView  name,
JobPriority  priority,
Fn &&  function,
uint32_t  dependencyCount = 0 
)
inline

◆ CreateJobAfter() [1/2]

template<typename Fn >
JobHandle Foundation::Core::JobSystem::CreateJobAfter ( StringView  name,
JobPriority  priority,
Span< const JobHandle prerequisites,
Fn &&  function 
)
inline

◆ CreateJobAfter() [2/2]

template<typename Fn >
JobHandle Foundation::Core::JobSystem::CreateJobAfter ( StringView  name,
Span< const JobHandle prerequisites,
Fn &&  function 
)
inline

◆ CreateJobInternal()

JobHandle Foundation::Core::JobSystem::CreateJobInternal ( StringView  name,
JobPriority  priority,
UniquePtr< JobCallable callable,
uint32_t  dependencyCount 
)
private

◆ Dispatch()

template<typename Fn >
JobHandle Foundation::Core::JobSystem::Dispatch ( StringView  name,
size_t  count,
size_t  step,
JobPriority  priority,
Fn &&  function 
)
inline

◆ EndSubmit()

void Foundation::Core::JobSystem::EndSubmit ( )
privatenoexcept

◆ Finish()

void Foundation::Core::JobSystem::Finish ( JobHandle const &  job,
JobStatus  status 
)
privatenoexcept

◆ GetMaxConcurrency()

size_t Foundation::Core::JobSystem::GetMaxConcurrency ( ) const
inlinenoexcept

◆ GetWorkerCount()

size_t Foundation::Core::JobSystem::GetWorkerCount ( ) const
inlinenoexcept

◆ Join()

void Foundation::Core::JobSystem::Join ( )

◆ operator=()

JobSystem & Foundation::Core::JobSystem::operator= ( JobSystem const &  )
delete

◆ ParallelFor()

template<typename Fn >
JobBarrier Foundation::Core::JobSystem::ParallelFor ( StringView  name,
size_t  count,
size_t  step,
Fn &&  function 
)
inline

◆ PriorityIndex()

static constexpr size_t Foundation::Core::JobSystem::PriorityIndex ( JobPriority  priority)
inlinestaticconstexprprivatenoexcept

◆ Queue()

void Foundation::Core::JobSystem::Queue ( JobHandle const &  job)
privatenoexcept

◆ RegisterSuccessor()

void Foundation::Core::JobSystem::RegisterSuccessor ( JobHandle const &  prerequisite,
JobHandle const &  dependent 
)
private

◆ ReleaseBarrier()

void Foundation::Core::JobSystem::ReleaseBarrier ( )
privatenoexcept

◆ ReleaseDependency()

void Foundation::Core::JobSystem::ReleaseDependency ( JobHandle const &  job,
uint32_t  count,
bool  prerequisiteFailed 
)
private

◆ Shutdown()

void Foundation::Core::JobSystem::Shutdown ( )

◆ TryExecuteOne()

bool Foundation::Core::JobSystem::TryExecuteOne ( size_t  workerId)
private

◆ Wait() [1/2]

void Foundation::Core::JobSystem::Wait ( JobBarrier &&  barrier)
inline

◆ Wait() [2/2]

void Foundation::Core::JobSystem::Wait ( JobBarrier barrier)

◆ WorkerMain()

void Foundation::Core::JobSystem::WorkerMain ( size_t  workerId)
private

Friends And Related Symbol Documentation

◆ JobBarrier

friend class JobBarrier
friend

◆ JobDependency

friend class JobDependency
friend

◆ JobHandle

friend class JobHandle
friend

Member Data Documentation

◆ mAccepting

Atomic<bool> Foundation::Core::JobSystem::mAccepting {true}
private

◆ mAllocator

Allocator* Foundation::Core::JobSystem::mAllocator
private

◆ mCallerMutex

Mutex Foundation::Core::JobSystem::mCallerMutex
private

◆ mMaxBarriers

size_t Foundation::Core::JobSystem::mMaxBarriers
private

◆ mName

String Foundation::Core::JobSystem::mName
private

◆ mOutstanding

Atomic<size_t> Foundation::Core::JobSystem::mOutstanding {0}
private

◆ mPool

SharedPtr<JobPool> Foundation::Core::JobSystem::mPool
private

◆ mReady

ReadyQueues Foundation::Core::JobSystem::mReady
private

◆ mStopped

Atomic<bool> Foundation::Core::JobSystem::mStopped {false}
private

◆ mStopping

Atomic<bool> Foundation::Core::JobSystem::mStopping {false}
private

◆ mSubmitCV

CondVar Foundation::Core::JobSystem::mSubmitCV
private

◆ mSubmitMutex

Mutex Foundation::Core::JobSystem::mSubmitMutex
private

◆ mSubmitting

size_t Foundation::Core::JobSystem::mSubmitting {}
private

◆ mThreads

Vector<Thread> Foundation::Core::JobSystem::mThreads
private

◆ mWakeEpoch

Atomic<size_t> Foundation::Core::JobSystem::mWakeEpoch {0}
private

The documentation for this class was generated from the following files: