hkMultiThreadCheck.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_DYNAMICS2_MULTI_THREADING_TYPES_H
  9. #define HK_DYNAMICS2_MULTI_THREADING_TYPES_H
  10. #if defined (HK_DEBUG) && !defined(HK_PLATFORM_SPU)
  11. /// Enabling multi threading debugging. This is currently only done in debug mode.
  12. /// If you use a debug build and link against release libraries, everything should work fine except you do not get multithreaded debugging.
  13. /// If you use a release build and link against debug libraries, you have to enable this define in order to avoid the asserts
  14. # define HK_DEBUG_MULTI_THREADING
  15. #endif
  16. #ifdef HK_DEBUG_MULTI_THREADING
  17. # define HK_ON_DEBUG_MULTI_THREADING(x) x
  18. #else
  19. # define HK_ON_DEBUG_MULTI_THREADING(x)
  20. #endif
  21. /// A structure used in hkpWorld to provide debug access checking.
  22. class hkMultiThreadCheck
  23. {
  24. public:
  25. HK_DECLARE_NONVIRTUAL_CLASS_ALLOCATOR(HK_MEMORY_CLASS_WORLD, hkMultiThreadCheck);
  26. HK_DECLARE_REFLECTION();
  27. enum AccessType
  28. {
  29. HK_ACCESS_IGNORE = 0,
  30. HK_ACCESS_RO     = 1,
  31. HK_ACCESS_RW     = 2,
  32. };
  33. HK_FORCE_INLINE hkMultiThreadCheck();
  34. HK_FORCE_INLINE void init();
  35. enum ReadMode
  36. {
  37. THIS_OBJECT_ONLY,
  38. RECURSIVE
  39. };
  40. /// Mark this class and (if mode = RECURSUVE all child classes)
  41. /// for read only access for this thread
  42. /// Note: This is only for debugging and does not wait to get exclusive access, 
  43. /// but simply assert if another thread marked the hkpWorld. You must read the
  44. /// user guide about multithreading to use this.
  45. HK_FORCE_INLINE void markForRead( ReadMode mode = RECURSIVE )
  46. {
  47. HK_ON_DEBUG_MULTI_THREADING( markForReadImpl(mode) );
  48. }
  49. /// Mark this class and all child classes for read write access for this thread
  50. /// Note: This is only for debugging and does not wait to get exclusive access, 
  51. /// but simply assert if another thread marked the hkpWorld. You must read the
  52. /// user guide about multithreading to use this.
  53. HK_FORCE_INLINE void markForWrite( )
  54. {
  55. HK_ON_DEBUG_MULTI_THREADING( markForWriteImpl() );
  56. }
  57. /// Returns true, if this class already has write access
  58. HK_FORCE_INLINE bool isMarkedForWrite( )
  59. {
  60. #ifdef HK_DEBUG_MULTI_THREADING
  61. return isMarkedForWriteImpl();
  62. #else
  63. return true;
  64. #endif
  65. }
  66. HK_FORCE_INLINE bool isMarkedForReadRecursive()
  67. {
  68. #ifdef HK_DEBUG_MULTI_THREADING
  69. return hkUint32(MARKED_RO) == m_threadId;
  70. #else
  71. return true;
  72. #endif
  73. }
  74. /// Undo markForRead
  75. /// Note: This is only for debugging and does not wait to get exclusive access, 
  76. /// but simply assert if another thread marked the hkpWorld. You must read the
  77. /// user guide about multithreading to use this.
  78. HK_FORCE_INLINE void unmarkForRead( )
  79. {
  80. HK_ON_DEBUG_MULTI_THREADING( unmarkForReadImpl() );
  81. }
  82. /// Unmark For write
  83. /// Note: This is only for debugging and does not wait to get exclusive access, 
  84. /// but simply assert if another thread marked the hkpWorld. You must read the
  85. /// user guide about multithreading to use this.
  86. HK_FORCE_INLINE void unmarkForWrite()
  87. {
  88. HK_ON_DEBUG_MULTI_THREADING( unmarkForWriteImpl() );
  89. }
  90. /// Disable checks
  91. void disableChecks();
  92. /// Re-enables checks.
  93. void enableChecks();
  94. /// Get whether checking is enabled
  95. bool isCheckingEnabled() const;
  96. void accessCheck( AccessType type ) const;
  97. static void HK_CALL accessCheckWithParent( const hkMultiThreadCheck* parentLock, AccessType parentType, const hkMultiThreadCheck& lock, AccessType type );
  98. /// call this to enable this utility
  99. static void staticInit();
  100. /// call this to disable this utility
  101. /// calling this function is not necessary, you will just get a small memory leak
  102. static void staticQuit();
  103. protected:
  104. void markForReadImpl(ReadMode mode  );
  105. void markForWriteImpl( );
  106. bool isMarkedForWriteImpl( );
  107. void unmarkForReadImpl( );
  108. void unmarkForWriteImpl();
  109. public:
  110. enum
  111. {
  112. DISABLED = 0xffffffd1,
  113. MARKED_RO = 0xffffffe1, // and all children
  114. MARKED_RO_SELF_ONLY = 0xffffffc1,
  115. UNMARKED = 0xfffffff1
  116. };
  117. // Stored in a 64bit property anyway, and in the sim islands (not serialized, so we can use more than the previous 8 bits)
  118. // If the threadid is bigger we can catch similar ids better (the id is not an index but the actual platform id)
  119. hkUint32 m_threadId; //+nosave
  120. hkInt16 m_markCount; //+nosave
  121.   protected:
  122. /// This is a 16 bit unsigned integer that stores the state of any nested
  123. /// marks. If you are nesting read marks inside write marks, this stores
  124. /// the order that the marks were placed, to ensure symmetric calls to
  125. /// markForRead and markForWrite. A set bit indicates a write mark and an
  126. /// unset bit indicates a read mark. The top of the  stack is always the
  127. /// least significant bit. The size of the stack is always equal to the
  128.     /// current value of 'm_markCount'.
  129. hkUint16 m_markBitStack; //+nosave
  130. public:
  131. static class hkCriticalSection* m_criticalSection;
  132. };
  133. #ifdef HK_DEBUG_MULTI_THREADING
  134. # define HK_ACCESS_CHECK_WITH_PARENT( parent, parentAccess, object, objectAccess ) hkMultiThreadCheck::accessCheckWithParent( (parent)? &(parent)->getMultiThreadCheck():HK_NULL, hkMultiThreadCheck:: parentAccess, object->getMultiThreadCheck(), hkMultiThreadCheck:: objectAccess )
  135. # define HK_ACCESS_CHECK_OBJECT( object, objectAccess ) if ( object ){ object->m_multiThreadCheck.accessCheck( hkMultiThreadCheck:: objectAccess ); }
  136. hkMultiThreadCheck::hkMultiThreadCheck(): m_threadId( (hkUint32)UNMARKED ), m_markCount(0) {}
  137. void hkMultiThreadCheck::init(){ m_threadId = (hkUint32)UNMARKED; m_markCount = 0; }
  138. #else
  139. # define HK_ACCESS_CHECK_WITH_PARENT( parent, parentAccess, object, objectAccess ) 
  140. # define HK_ACCESS_CHECK_OBJECT( object, objectAccess ) 
  141. hkMultiThreadCheck::hkMultiThreadCheck(): m_threadId( (hkUint32) DISABLED ), m_markCount (0){}
  142. void hkMultiThreadCheck::init(){ m_threadId = (hkUint32)DISABLED; m_markCount = 0; }
  143. #endif
  144. #endif // HK_DYNAMICS2_MULTI_THREADING_TYPES_H
  145. /*
  146. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  147. * Confidential Information of Havok.  (C) Copyright 1999-2009
  148. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  149. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  150. * rights, and intellectual property rights in the Havok software remain in
  151. * Havok and/or its suppliers.
  152. * Use of this software for evaluation purposes is subject to and indicates
  153. * acceptance of the End User licence Agreement for this product. A copy of
  154. * the license is included with this software and is also available at www.havok.com/tryhavok.
  155. */