VR-Forces 4.10 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
parallelTickManager.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2014 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
9 
12 
13 #pragma once
14 
15 #include "vrfcore/vrfcoreDefines.h"
16 
18 
19 #include <boost/noncopyable.hpp>
20 #include <boost/unordered/unordered_map.hpp>
21 #include <boost/ptr_container/ptr_vector.hpp>
22 
23 #include <tbb/mutex.h>
24 #include <tbb/tbb_thread.h>
25 #include <tbb/compat/condition_variable>
26 #include <tbb/enumerable_thread_specific.h>
27 #include <tbb/atomic.h>
28 #include <tbb/concurrent_queue.h>
29 
30 #include <vector>
31 
36 class DtCriticalSection;
37 class DtSimManager;
38 
62 class DT_DLL_vrfcore DtParallelTickManager : boost::noncopyable
63 {
64 public:
66  {
70  DEFERRED
71  };
72 
76  {
77  friend class DtParallelTickManager;
78 
80  void run();
81 
82  public:
83  virtual ~CallbackInterface();
84 
86  virtual void runCallback() = 0;
87  };
88 
89  typedef boost::unordered_map<std::string, bool> EnabledMap;
90 
92  virtual ~DtParallelTickManager();
93 
95  virtual void setCallbackQueue(DtVrfCallbackQueue*);
96 
98  virtual DtVrfCallbackQueue* queue() const;
99 
106 
107  virtual void flushQueue(bool useThisThread);
108  virtual void flushQueue();
110 
112  virtual void clearDeferredJobs();
113 
115 
116  virtual bool mainThreadWait() const;
117  virtual void setMainThreadWait(bool);
119 
123 
124  virtual unsigned maxSpinCount() const;
125  virtual void setMaxSpinCount(unsigned);
127 
130 
131  virtual bool active() const;
132  virtual void setActive(bool);
134 
143  virtual bool enabled(const std::string&, bool def) const;
144 
146  virtual bool executeCommand(const std::string&, bool on);
147 
149  virtual void printInfo(std::ostream&) const;
150 
158 
159  virtual void addCallback(CallbackInterface*);
160  virtual void addCallback(CallbackInterface&);
161 
162  virtual void addCallback(CallbackInterface*, const std::string& tag, bool def=true);
163  virtual void addCallback(CallbackInterface&, const std::string& tag, bool def=true);
164 
165  void addCallback(CallbackInterface*, const char* tag, bool def=true);
166  void addCallback(CallbackInterface&, const char* tag, bool def=true);
167 
168  template <typename Container>
169  void addCallbacks(Container& cont)
170  {
171  typedef typename Container::iterator iterator;
172  for (iterator i=cont.begin(), end=cont.end(); i != end; ++i)
173  addCallback(*i);
174  }
175 
176  template <typename Container>
177  void addCallbacks(Container& cont, const std::string& tag, bool def=true)
178  {
179  bool runNow = !enabled(tag, def);
180  typedef typename Container::iterator iterator;
181  if (runNow)
182  {
183  for (iterator i = cont.begin(), end = cont.end(); i != end; ++i)
184  {
185  RunJob(*i);
186  }
187  }
188  else
189  {
190  for (iterator i = cont.begin(), end = cont.end(); i != end; ++i)
191  {
192  addCallback(*i);
193  }
194  }
195  }
196 
197  template <typename Container>
198  void addCallbacks(Container& cont, const char* tag, bool def=true)
199  {
200  addCallbacks(cont, std::string(tag), def);
201  }
203 
208 
209  virtual bool lock();
210  virtual bool unlock();
211  virtual bool readLock();
212  virtual bool readUnlock();
213  virtual bool upgradeToWriter();
214  virtual bool downgradeToReader();
215 
216  virtual bool changeAccess(AccessType from, AccessType to);
218 
230 
231 
234  enum JobClass
235  {
238  };
239 
244  virtual void configureDeferredJobClass(
245  JobClass jobclass,
246  AccessType access,
247  unsigned maxConcurrent);
248 
250  virtual void addDeferredJob(JobClass jobclass, const boost::function<void ()>& callback);
251 
253 
254  virtual void addVRLinkDeferredJob(const boost::function<void()>& callback);
256 
260  virtual void setDeferJobs(bool);
262 
263  class ThreadLocalInfo;
264 
265  virtual ThreadLocalInfo& threadLocalInfo();
266 
267 private:
268  static void RunJob(CallbackInterface*);
269  static void RunJob(CallbackInterface&);
270 
271  virtual void executeDeferredJobs(AccessType access);
272  virtual void flushDeferredJobs();
273 
274  tbb::atomic<int> myAccessCount;
275 
276  typedef tbb::cache_aligned_allocator<ThreadLocalInfo*> ThreadLocalAllocator;
277  //typedef tbb::enumerable_thread_specific<
279  typedef tbb::enumerable_thread_specific<
280  ThreadLocalInfo*,
282  tbb::ets_key_per_instance> ThreadLocalContainer;
283 
285 
288 
291  unsigned myMaxSpinCount;
292 
293  struct ClassInfo
294  {
295  typedef tbb::concurrent_queue< boost::function<void()> > JobQueue;
296 
298  tbb::atomic<unsigned> jobCount;
299  tbb::atomic<unsigned> runCount;
300  unsigned max;
302 
303  explicit ClassInfo(
304  AccessType access = EXCLUSIVE,
305  unsigned max = 1);
306  };
307 
309  boost::ptr_vector<ClassInfo> myDeferredJobs;
310  tbb::atomic<unsigned> myDeferredJobCount;
311 
314 };
315 
324 class DT_DLL_vrfcore DtCriticalSection : boost::noncopyable
325 {
326 public:
328 
330  explicit DtCriticalSection(DtSimManager*, AccessType initState);
331 
333  explicit DtCriticalSection(DtSimManager*);
334 
337 
341 
343 
345  void reset(AccessType access);
346 
348  void unlock();
349 
351  void lockShared();
352 
354  void lock();
355 
357  void release()
358  {
359  reset(from);
360  }
361 
362 protected:
363  explicit DtCriticalSection(DtParallelTickManager*, AccessType to);
365 
366  friend class DtParallelTickManager;
367 
370 
373 };
374 
375 class DT_DLL_vrfcore DtParallelTickManager::ThreadLocalInfo : boost::noncopyable
376 {
377 public:
378  explicit ThreadLocalInfo(DtParallelTickManager* m);
379 
380  DtParallelTickManager::AccessType state() const;
381 
382 private:
383  friend class DtCriticalSection;
384 
385  void push(DtCriticalSection& cs);
386  void pop(DtCriticalSection& cs);
387 
388  typedef std::vector<DtCriticalSection*> Stack;
390 };
virtual DtVrfCallbackQueue * queue() const
Access the callback queue object.
tbb::enumerable_thread_specific< ThreadLocalInfo *, ThreadLocalAllocator, tbb::ets_key_per_instance > ThreadLocalContainer
DtCriticalSection, ThreadLocalAllocator&gt; ThreadLocalContainer;.
Definition: parallelTickManager.h:282
virtual unsigned maxSpinCount() const
Accessor/mutator for number of times to spin on spinlock before yielding processor.
tbb::atomic< unsigned > jobCount
Definition: parallelTickManager.h:298
void addCallbacks(Container &cont)
Definition: parallelTickManager.h:169
virtual bool executeCommand(const std::string &, bool on)
Execute a console command.
bool myWaitFlag
Definition: parallelTickManager.h:290
std::vector< DtCriticalSection * > Stack
Definition: parallelTickManager.h:388
virtual bool upgradeToWriter()
AccessType from
Definition: parallelTickManager.h:371
DtParallelTickManager(DtVrfSimOptionsInterface *options)
virtual void configureDeferredJobClass(JobClass jobclass, AccessType access, unsigned maxConcurrent)
Configure a job class.
JobQueue queue
Definition: parallelTickManager.h:297
Options for the configuring the sim.
Definition: vrfSimOptionsInterface.h:20
boost::unordered_map< std::string, bool > EnabledMap
Definition: parallelTickManager.h:89
virtual void printInfo(std::ostream &, size_t width=0) const
Print detailed info to stream.
DtVrfCallbackQueue * myCallbackQueue
Definition: parallelTickManager.h:287
tbb::atomic< unsigned > myDeferredJobCount
Definition: parallelTickManager.h:310
virtual void setDeferJobs(bool)
Enable/disable deferred jobs.
Definition: parallelTickManager.h:69
Enables parallelism in the main thread.
Definition: parallelTickManager.h:62
Simple asynchronous callback queue.
Definition: vrfCallbackQueue.h:32
ThreadLocalContainer myThreadLocals
Definition: parallelTickManager.h:284
virtual void clearDeferredJobs()
Clear out all deferred jobs from the various queues.
void addCallbacks(Container &cont, const std::string &tag, bool def=true)
Definition: parallelTickManager.h:177
virtual void addVRLinkDeferredJob(const boost::function< void()> &callback)
Convenience functions.
Definition: parallelTickManager.h:237
virtual void setActive(bool)
DtVrfSimOptionsInterface * myOptions
Definition: parallelTickManager.h:286
unsigned myMaxSpinCount
Definition: parallelTickManager.h:291
virtual void flushQueue()
EnabledMap myEnabledMap
Definition: parallelTickManager.h:289
virtual bool unlock()
API for writing callbacks.
Definition: vrfCallbackQueue.h:58
ThreadLocalInfo(DtParallelTickManager *m)
JobClass
Deferred Jobs is a mechanism for deferring work until a later time.
Definition: parallelTickManager.h:234
void addCallbacks(Container &cont, const char *tag, bool def=true)
Definition: parallelTickManager.h:198
AccessType to
Definition: parallelTickManager.h:372
A utility class for use with DtConsoleCommandManager.
Definition: consoleCommandManager.h:157
Definition: parallelTickManager.h:236
Definition: parallelTickManager.h:293
boost::ptr_vector< ClassInfo > myDeferredJobs
Definition: parallelTickManager.h:309
virtual bool lock()
Manipulate global mutex.
AccessType
Definition: parallelTickManager.h:65
bool myDeferJobsFlag
Definition: parallelTickManager.h:308
virtual bool enabled(const std::string &, bool def) const
Simple mechanism for controlling multiple parallel sections.
virtual bool active() const
Accessor/mutator for the entire parallel mechanism.
virtual void addDeferredJob(JobClass jobclass, const boost::function< void()> &callback)
Add a deferred job.
virtual bool readUnlock()
DtSubCommandManager * myCommandManager
Definition: parallelTickManager.h:312
tbb::cache_aligned_allocator< ThreadLocalInfo * > ThreadLocalAllocator
Definition: parallelTickManager.h:276
virtual void setMainThreadWait(bool)
DtParallelTickManager::AccessType AccessType
Definition: parallelTickManager.h:327
AccessType access
Definition: parallelTickManager.h:301
DtParallelTickManager::ThreadLocalInfo * info
Definition: parallelTickManager.h:369
virtual void setCallbackQueue(DtVrfCallbackQueue *)
Takes ownership.
static void RunJob(CallbackInterface *)
A specialized version of DtConsoleCommandManager which handles a set of sub commands from another con...
Definition: consoleCommandManager.h:126
The simulation engine is controlled by a single,top-level class called the Simulation Manager...
Definition: simManager.h:103
virtual bool readLock()
virtual bool downgradeToReader()
virtual ~DtParallelTickManager()
DtParallelTickManager * mgr
Definition: parallelTickManager.h:368
virtual void addCallback(CallbackInterface *)
Add callbacks to the queue.
DtConsoleCommandOwner * myCommandOwner
Definition: parallelTickManager.h:313
virtual bool changeAccess(AccessType from, AccessType to)
tbb::atomic< int > myAccessCount
Definition: parallelTickManager.h:274
tbb::atomic< unsigned > runCount
Definition: parallelTickManager.h:299
tbb::concurrent_queue< boost::function< void()> > JobQueue
Definition: parallelTickManager.h:295
RAII manager object for accessing paralle tick functionality.
Definition: parallelTickManager.h:324
Interface for defining callbacks.
Definition: parallelTickManager.h:75
Definition: parallelTickManager.h:67
virtual bool mainThreadWait() const
Accessor/mutator for main thread participation in running callbacks.
#define DT_DLL_vrfcore
This file is used to determine how to build.
Definition: vrfcoreDefines.h:25
Stack myLocks
Definition: parallelTickManager.h:389
unsigned max
Definition: parallelTickManager.h:300
virtual void setMaxSpinCount(unsigned)
Definition: parallelTickManager.h:68
void release()
Set mutex state to value it had when this object was created.
Definition: parallelTickManager.h:357

Document ID: Generated on Tue Sep 21 17:42:52 EDT 2021 from SVN revision 234861
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)