![]() |
VR-Forces 4.10 Class Documentation
|
Enables parallelism in the main thread. More...

Classes | |
| class | CallbackInterface |
| Interface for defining callbacks. More... | |
| struct | ClassInfo |
Public Types | |
| enum | AccessType { EXCLUSIVE, SHARED, UNLOCKED, DEFERRED } |
| typedef boost::unordered_map < std::string, bool > | EnabledMap |
Public Member Functions | |
| DtParallelTickManager (DtVrfSimOptionsInterface *options) | |
| virtual | ~DtParallelTickManager () |
| virtual void | setCallbackQueue (DtVrfCallbackQueue *) |
| Takes ownership. More... | |
| virtual DtVrfCallbackQueue * | queue () const |
| Access the callback queue object. More... | |
| virtual void | clearDeferredJobs () |
| Clear out all deferred jobs from the various queues. More... | |
| virtual bool | enabled (const std::string &, bool def) const |
| Simple mechanism for controlling multiple parallel sections. More... | |
| virtual bool | executeCommand (const std::string &, bool on) |
| Execute a console command. More... | |
| virtual void | printInfo (std::ostream &) const |
| Print information about current state. More... | |
| virtual void | setDeferJobs (bool) |
| Enable/disable deferred jobs. More... | |
| virtual ThreadLocalInfo & | threadLocalInfo () |
| ThreadLocalInfo (DtParallelTickManager *m) | |
| DtParallelTickManager::AccessType | state () const |
| virtual void | flushQueue (bool useThisThread) |
| Wait for all queued tasks to complete This function is called when you have added a bunch of tasks to the queue and need to make sure they are finished before proceeding. More... | |
| virtual void | flushQueue () |
| virtual bool | mainThreadWait () const |
| Accessor/mutator for main thread participation in running callbacks. More... | |
| virtual void | setMainThreadWait (bool) |
| virtual unsigned | maxSpinCount () const |
| Accessor/mutator for number of times to spin on spinlock before yielding processor. More... | |
| virtual void | setMaxSpinCount (unsigned) |
| virtual bool | active () const |
| Accessor/mutator for the entire parallel mechanism. More... | |
| virtual void | setActive (bool) |
| virtual void | addCallback (CallbackInterface *) |
| Add callbacks to the queue. More... | |
| virtual void | addCallback (CallbackInterface &) |
| virtual void | addCallback (CallbackInterface *, const std::string &tag, bool def=true) |
| virtual void | addCallback (CallbackInterface &, const std::string &tag, bool def=true) |
| void | addCallback (CallbackInterface *, const char *tag, bool def=true) |
| void | addCallback (CallbackInterface &, const char *tag, bool def=true) |
| template<typename Container > | |
| void | addCallbacks (Container &cont) |
| template<typename Container > | |
| void | addCallbacks (Container &cont, const std::string &tag, bool def=true) |
| template<typename Container > | |
| void | addCallbacks (Container &cont, const char *tag, bool def=true) |
| virtual bool | lock () |
| Manipulate global mutex. More... | |
| virtual bool | unlock () |
| virtual bool | readLock () |
| virtual bool | readUnlock () |
| virtual bool | upgradeToWriter () |
| virtual bool | downgradeToReader () |
| virtual bool | changeAccess (AccessType from, AccessType to) |
Private Types | |
| typedef tbb::cache_aligned_allocator < ThreadLocalInfo * > | ThreadLocalAllocator |
| typedef tbb::enumerable_thread_specific < ThreadLocalInfo *, ThreadLocalAllocator, tbb::ets_key_per_instance > | ThreadLocalContainer |
| DtCriticalSection, ThreadLocalAllocator> ThreadLocalContainer;. More... | |
| typedef std::vector < DtCriticalSection * > | Stack |
Private Member Functions | |
| virtual void | executeDeferredJobs (AccessType access) |
| virtual void | flushDeferredJobs () |
| void | push (DtCriticalSection &cs) |
| void | pop (DtCriticalSection &cs) |
Static Private Member Functions | |
| static void | RunJob (CallbackInterface *) |
| static void | RunJob (CallbackInterface &) |
Private Attributes | |
| tbb::atomic< int > | myAccessCount |
| ThreadLocalContainer | myThreadLocals |
| DtVrfSimOptionsInterface * | myOptions |
| DtVrfCallbackQueue * | myCallbackQueue |
| EnabledMap | myEnabledMap |
| bool | myWaitFlag |
| unsigned | myMaxSpinCount |
| bool | myDeferJobsFlag |
| boost::ptr_vector< ClassInfo > | myDeferredJobs |
| tbb::atomic< unsigned > | myDeferredJobCount |
| DtSubCommandManager * | myCommandManager |
| DtConsoleCommandOwner * | myCommandOwner |
| Stack | myLocks |
Friends | |
| class | DtCriticalSection |
| enum | JobClass { JobClass_VRLINK, JobClass_MAX } |
| Deferred Jobs is a mechanism for deferring work until a later time. More... | |
| virtual void | configureDeferredJobClass (JobClass jobclass, AccessType access, unsigned maxConcurrent) |
| Configure a job class. More... | |
| virtual void | addDeferredJob (JobClass jobclass, const boost::function< void()> &callback) |
| Add a deferred job. More... | |
| virtual void | addVRLinkDeferredJob (const boost::function< void()> &callback) |
| Convenience functions. More... | |
Enables parallelism in the main thread.
This class wraps a mutex and a callback queue thread pool which are used to execute multiple functions in parallel in the sim main thread. The mutex protects the entire global state of VR-Forces.
There are two ways to execute a callback, normal (parallel) or serial. The normal method just executes the callback with no synchronization. If the callback needs to access any of the global VR-Forces state then it must use create a SerialScopeGuard around that section (just like a mutex scope lock). This will lock the global mutex and prevent any other threads from accessing the global state. The serial method locks the global mutex when the callback is called This means that all other threads accessing the global state will have to wait. A serial executed callback can use ParallelScopeGuard to unlock the global mutex around a section which does not access any global state.
By default DtVrfObjects are ticked in serial since they all access the global state. Individual actuators that have safe sections (like terrain intersections or feature queries) can then be modified as needed by inserting ParallelScopeGuards.
Users generally do not access this class directly, see DtCriticalSection.
| typedef boost::unordered_map<std::string, bool> DtParallelTickManager::EnabledMap |
|
private |
|
private |
DtCriticalSection, ThreadLocalAllocator> ThreadLocalContainer;.
|
private |
Deferred Jobs is a mechanism for deferring work until a later time.
For example, the VRLink API is not thread safe, so sending messages and ticking VRLink components must be done in EXCLUSIVE mode. Since there should be no code accessing VRLink code when not in EXCLUSIVE mode, it is possible for another thread to call into VRLink if it can guarantee it is the only thread doing so. Adding a job to the JobClass_VRLINK job class will queue it to be executed by an arbitrary thread the next time that thread becomes SHARED. The system guarantees that only one thread at a time will try execute VRLink jobs. The max number of threads and the access mode in which jobs will be executed can be set by calling configureDeferredJobClass in order to setup custom job classes. Any jobs which are still queued after all components are ticked will be run in the main thread. Standard job classes. You can add your own as long as they are equal to or above JobClass_MAX in value.
| Enumerator | |
|---|---|
| JobClass_VRLINK | |
| JobClass_MAX | |
|
explicit |
|
virtual |
|
virtual |
Takes ownership.
|
virtual |
Access the callback queue object.
|
virtual |
Wait for all queued tasks to complete This function is called when you have added a bunch of tasks to the queue and need to make sure they are finished before proceeding.
Whether the calling thread waits or participates in calling the callbacks is controlled by the useThisThread parameter or DtVrfSimOptionsInterface::flushCallbackQueueInMainThread if not supplied.
|
virtual |
|
virtual |
Clear out all deferred jobs from the various queues.
|
virtual |
Accessor/mutator for main thread participation in running callbacks.
|
virtual |
|
virtual |
Accessor/mutator for number of times to spin on spinlock before yielding processor.
Setting to 0 will turn off yielding. Default is 0.
|
virtual |
|
virtual |
Accessor/mutator for the entire parallel mechanism.
Disabling will delete the queue and execute callbacks in the calling thread.
|
virtual |
Simple mechanism for controlling multiple parallel sections.
This class is designed to be used by multiple sections of code to execute different sets of parallel callbacks. This function allows each of those sections to be named and then have their options controlled individually by this class. If you supply a tag in any of the add callback functions a record will be made of that that tag by this function.
| def | Default value to record if it's a new tag. |
Referenced by addCallbacks().
Execute a console command.
|
virtual |
Print information about current state.
|
virtual |
Add callbacks to the queue.
The pointer versions take ownership of their callbacks. The reference versions do not and require the caller to keep them alive. The container versions add an STL-like container of callbacks.
| runNow | Execute the callback right now instead of adding it the queue. |
| tag | See enabled(). |
| def | Default value for enabled(). |
Referenced by addCallbacks().
|
virtual |
|
virtual |
|
virtual |
| void DtParallelTickManager::addCallback | ( | CallbackInterface * | , |
| const char * | tag, | ||
| bool | def = true |
||
| ) |
| void DtParallelTickManager::addCallback | ( | CallbackInterface & | , |
| const char * | tag, | ||
| bool | def = true |
||
| ) |
|
inline |
References addCallback().
Referenced by addCallbacks().
|
inline |
References addCallback(), enabled(), and RunJob().
|
inline |
References addCallbacks().
|
virtual |
Manipulate global mutex.
|
virtual |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
|
virtual |
Configure a job class.
| jobclass | Job class to configure. |
| access | Access type in which the jobs will be run. |
| maxConcurrent | The number of thread which can run jobs from this class concurrently. |
|
virtual |
Add a deferred job.
|
virtual |
Convenience functions.
|
virtual |
Enable/disable deferred jobs.
Deferred jobs are disabled by default and enabled during entity tick. When disabled jobs will be run during when the are added with the access mode as EXCLUSIVE.
|
virtual |
|
staticprivate |
Referenced by addCallbacks().
|
staticprivate |
|
privatevirtual |
|
privatevirtual |
|
explicit |
| DtParallelTickManager::AccessType DtParallelTickManager::state | ( | ) | const |
|
private |
|
private |
|
friend |
|
private |
|
private |
|
private |
|
private |
|
mutableprivate |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |