hkCpuJobThreadPool.h
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. #ifndef HK_BASE_CPU_THREAD_POOL_H
  9. #define HK_BASE_CPU_THREAD_POOL_H
  10. #include <Common/Base/Thread/Job/ThreadPool/hkJobThreadPool.h>
  11. #include <Common/Base/Thread/Semaphore/hkSemaphore.h>
  12. #include <Common/Base/Thread/Thread/hkThread.h>
  13. /// The construction info for the hkCpuJobThreadPool
  14. struct hkCpuJobThreadPoolCinfo
  15. {
  16. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkCpuJobThreadPoolCinfo );
  17. /// The number of threads (defaults to 1)
  18. int m_numThreads;
  19. /// The Havok stack size for each thread (defaults to 4 Mb)
  20. int m_havokStackSize;
  21. /// The program stack size for each thread
  22. /// On Win32 and Xbox 360, defaults to 0, meaning the thread inherits the executable's stack size
  23. /// One PLAYSTATION(R)3, defaults to 256K
  24. /// Has no effect on other platforms (e.g. posix)
  25. int m_stackSize;
  26. /// This is the buffer size allocated in each thread for collecting timer
  27. /// information. It defaults to 0, which means timers will be disabled.
  28. /// To view timers in the VDB, you need to set this buffer size to a non zero value.
  29. /// 2000000 (2 Mb) is a good recommended size. Smaller buffers are ok, but you may
  30. /// lose timer info.
  31. int m_timerBufferPerThreadAllocation;
  32. /// Whether to set large memory blocks, needed by Havok physics during multithreading simulation,
  33. /// during multithreaded constraint solve. This defaults to true.
  34. bool m_allocateRuntimeMemoryBlocks;
  35. /// If this data is used to set the hardware thread ids, on XBox360, XSetThreadProcessor is called on each thread
  36. /// with the hardware id. If this array is not set then it defaults to {2, 4, 1, 3, 5, 0} (i.e. the first 3 threads
  37. /// are set to separate cores).
  38. /// On Windows, it will use SetThreadIdealProcessor, and will use {1,2...,(numProcessors-1),0} by default if this array 
  39. /// not set. 
  40. /// The two defaults assume that you are using core 0 as your main calling thread (that will do work too)
  41. hkArray<int> m_hardwareThreadIds;
  42. /// The thread name to be passed to hkThread::startThread
  43. const char* m_threadName;
  44. hkCpuJobThreadPoolCinfo();
  45. };
  46. /// Utility class for running Havok in multiple threads.
  47. /// The utility creates a pool of threads, and suspends them with a semaphore. On each call to
  48. /// startStep the main thread resumes/releases all physics threads.
  49. class hkCpuJobThreadPool : public hkJobThreadPool
  50. {
  51. public:
  52. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_UTILITIES);
  53. enum { MAX_NUM_THREADS = 6 };
  54. /// Initialize multi-threading state and create threads.
  55. /// This will also call  hkReferencedObject::setLockMode( hkReferencedObject::LOCK_MODE_MANUAL);
  56. hkCpuJobThreadPool( const hkCpuJobThreadPoolCinfo& cinfo );
  57. /// Destroy threads and delete state.
  58. /// This will also call  hkReferencedObject::setLockMode( hkReferencedObject::LOCK_MODE_NONE);
  59. ~hkCpuJobThreadPool();
  60. /// Process jobs using all threads until completion for all jobs on the queue
  61. virtual void processAllJobs( hkJobQueue* queue, hkJobType firstJobType_unused = HK_JOB_TYPE_MAX );
  62. /// Wait until all threads have emptied the Queue
  63. virtual void waitForCompletion( );
  64. /// Returns true if processAllJobs has been called but waitForCompletion has not been
  65. virtual bool isProcessing();
  66. /// Get the timer data collected during processJobs
  67. virtual void appendTimerData( hkArray<hkTimerData>& timerData );
  68. /// Clear the timer data.  This must be done every frame or the timers will overrun
  69. virtual void clearTimerData();
  70. /// Get number of threads currently running
  71. virtual int getNumThreads();
  72. /// Set the number of threads currently running. Returns the number of threads actually set.
  73. virtual void setNumThreads(int numThreads);
  74. protected:
  75. void addThread();
  76. void removeThread();
  77. public:
  78. struct SharedThreadData;
  79. /// Thread state data. Used only by one worker thread
  80. struct WorkerThreadData
  81. {
  82. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_ENTITY, WorkerThreadData);
  83. WorkerThreadData();
  84. /// Pointer to the data shared between threads.
  85. SharedThreadData* m_sharedThreadData;
  86. /// System handle to the thread.
  87. hkThread m_thread;
  88. /// Thread Id from 0 - N
  89. int m_threadId;
  90. //
  91. int m_hardwareThreadId;
  92. /// Flag is set to true when the thread is requested to close.
  93. bool m_killThread;
  94. bool m_clearTimers;
  95. /// Semaphore used to pause a physics thread after it's done its calculations.
  96. /// This semaphore is released by the main thread on every simulation step.
  97. hkSemaphore m_semaphore;
  98. // Internal buffer used for collecting and copying Havok's timer information from a
  99. // physics thread back to the main thread.
  100. char* m_monitorStreamBegin;
  101. char* m_monitorStreamEnd;
  102. };
  103. /// Data shared by all threads.
  104. struct SharedThreadData
  105. {
  106. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR( HK_MEMORY_CLASS_UTILITIES, hkCpuJobThreadPool::SharedThreadData );
  107. SharedThreadData();
  108. hkJobQueue* m_jobQueue;
  109. /// Semaphore used to pause the main thread when it waits for threads
  110. /// to finish their calculations.
  111. hkSemaphore m_workerThreadFinished;
  112. /// Number of threads.
  113. int m_numThreads;
  114. int m_localHavokStackSize;
  115. int m_timerBufferAllocation;
  116. };
  117. public:
  118. /// Data local to each physics thread.
  119. WorkerThreadData m_workerThreads[MAX_NUM_THREADS];
  120. protected:
  121. SharedThreadData m_sharedThreadData;
  122. /// Debugging flag set to true when worker threads are stepping
  123. hkBool m_isRunning;
  124. /// String for thread names (depending on platform support)
  125. const char* m_threadName;
  126. /// See comments for hkCpuJobThreadPoolCinfo::m_stackSize
  127. int m_stackSize;
  128. };
  129. #endif // HK_BASE_CPU_THREAD_POOL_H
  130. /*
  131. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  132. * Confidential Information of Havok.  (C) Copyright 1999-2009
  133. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  134. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  135. * rights, and intellectual property rights in the Havok software remain in
  136. * Havok and/or its suppliers.
  137. * Use of this software for evaluation purposes is subject to and indicates
  138. * acceptance of the End User licence Agreement for this product. A copy of
  139. * the license is included with this software and is also available at www.havok.com/tryhavok.
  140. */