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

其他游戏

开发平台:

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 HKBASE_HKREFERENCEDOBJECT_H
  9. #define HKBASE_HKREFERENCEDOBJECT_H
  10. extern const hkClass hkReferencedObjectClass;
  11. class hkStatisticsCollector;
  12. class hkCriticalSection;
  13. class hkVtableClassRegistry;
  14. /// Base for all classes in the Havok SDK.
  15. /// All core SDK objects that can be owned by multiple owners inherit from this class -
  16. /// rigid bodies, constraints, and actions are all hkReferencedObjects
  17. /// and any object that is memory managed by Havok also inherits from it.
  18. class hkReferencedObject : public hkBaseObject
  19. {
  20. public:
  21. HK_DECLARE_CLASS_ALLOCATOR(HK_MEMORY_CLASS_BASE_CLASS);
  22. HK_DECLARE_REFLECTION();
  23. /// Creates a new referenced object with an initial reference count of 1.
  24. HK_FORCE_INLINE hkReferencedObject();
  25. /// Copy constructor, any default subclass's copy constructor will correctly initialize reference count to 1.
  26. HK_FORCE_INLINE hkReferencedObject( const hkReferencedObject& originalObject );
  27. /// Destroy this object.
  28. virtual ~hkReferencedObject() { }
  29. /// Returns the size of this object
  30. /// A memory size of 0 is a special case and indicates
  31. /// that the object should not be freed (as it has
  32. /// probably been read in from a packed file for instance)
  33. /// or is embedded in another structure
  34. HK_FORCE_INLINE int getAllocatedSize() const;
  35. /// Returns the current reference count. Used for debugging only.
  36. HK_FORCE_INLINE int getReferenceCount() const;
  37. /// Adds a reference to the object - this increments the reference count.
  38. /// ###ACCESS_CHECKS###( [(&hkReferencedObjectLock::getInstance()),HK_ACCESS_RW] );
  39. void addReference() const;
  40. /// Removes a reference to the object - this decrements the last reference count.
  41. /// ###ACCESS_CHECKS###( [(&hkReferencedObjectLock::getInstance()),HK_ACCESS_RW] );
  42. void removeReference() const;
  43. /// Adds a reference to the object - this increments the reference count, but does not check for multithreaded access
  44. void addReferenceLockUnchecked() const;
  45. /// Removes a reference to the object - this decrements the last reference count. This does not check for multithreaded access.
  46. void removeReferenceLockUnchecked() const;
  47. /// Adds the references of a full array of referenced, this will call lockAll internally.
  48. static void HK_CALL addReferences( const hkReferencedObject*const* objects, int numObjects, int pointerStriding );
  49. /// Adds the references of a full array of referenced, this will call lockAll internally.
  50. template<typename T>
  51. static void HK_CALL addReferences( const T*const* objects, int numObjects, int pointerStriding = sizeof(T*) ) { addReferences( reinterpret_cast<const hkReferencedObject*const*>(objects), numObjects, pointerStriding ) ; HK_ON_DEBUG(numObjects > 0 && objects[0]->iMustBeDerivedFromReferencedObject()); }
  52. /// Removes the references of a full array of referenced, this will call lockAll internally.
  53. static void HK_CALL removeReferences( const hkReferencedObject*const* objects, int numObjects, int pointerStriding );
  54. /// Removes the references of a full array of referenced, this will call lockAll internally.
  55. template<typename T>
  56. static void HK_CALL removeReferences( const T*const* objects, int numObjects, int pointerStriding = sizeof(T*) ){ removeReferences( reinterpret_cast<const hkReferencedObject*const*>(objects), numObjects, pointerStriding ); HK_ON_DEBUG(numObjects > 0 && objects[0]->iMustBeDerivedFromReferencedObject()); }
  57. /// Mode which defines the locking policy, see setLockMode
  58. enum LockMode
  59. {
  60. //+reflected(False)
  61. /// no checking, no locking, good for single threaded applications
  62. LOCK_MODE_NONE,
  63. /// automatic locking of references, using lockAll is optional and will only improve performance
  64. LOCK_MODE_AUTO,
  65. /// manual locking of references, using lockAll is required.
  66. /// this mode should only be used when you debug to define performance bottlenecks
  67. LOCK_MODE_MANUAL
  68. };
  69. /// Sets the current lock policy.
  70. /// In a multithreaded environment, incrementing and decrementing reference counters must be thread safe.
  71. /// In a typical usage of Havok, calls to addReference() and removeReference() happen in groups, as a result
  72. /// we did not implement addReferences() using atomic operations but rely on explicit locks:
  73. ///  - In a single threaded application you can simply forget about locking and call setLockMode(LOCK_MODE_NONE)
  74. ///  - If you want automatic locking of references use setLockMode(LOCK_MODE_AUTO); this will be the slowest option, but works out of the box.
  75. /// -  If you care about performance and want to find all potential performance bottlenecks,
  76. ///    you can use setLockMode(LOCK_MODE_MANUAL) in a debug build.
  77. ///    In this case you explicitly have to call hkReferencedObject::lockAll/unlockAll()
  78. ///    and you get an error if you fail to do so. Typically you call lock/unlock around a bunch of add/removeReferences().
  79. /// Also for convenience hkpWorld::lock() calls hkReferencedObject::lockAll().
  80. static void HK_CALL setLockMode(LockMode mode);
  81. /// Returns the current lock mode, see setLockMode
  82. static LockMode HK_CALL getLockMode();
  83. /// Lock access to all referenceCounts.
  84. /// Typically you do this at the beginning of your single threaded section. If your mode is set to p LOCK_MODE_AUTO,
  85. /// this will still be useful as a group of add/remove reference calls will only perform a single lock.
  86. /// Note that recursive calls to lockAll() are allowed and very fast.
  87. static void HK_CALL lockAll();
  88. /// Unlock access to all referenceCounts
  89. static void HK_CALL unlockAll();
  90. /// Get the internal critical section used for locking reference counts
  91. static hkCriticalSection* HK_CALL getLockCriticalSection();
  92. /// Create the hkReferencedObjectLock singleton if it hasn't been created before.
  93. /// Either way initialize the lock mode.
  94. static void HK_CALL lockInit(LockMode lockMode);
  95. /// Return the type of this object. Returns HK_NULL if not known.
  96.         virtual const hkClass* getClassType() const;
  97.             /// Calculates the statistics for the contained members.
  98.             /// Returns HK_FAILURE if not implemented.
  99.         virtual void calcContentStatistics( hkStatisticsCollector* collector,const hkClass* cls ) const;
  100. public:
  101. enum
  102. {
  103. MASK_MEMSIZE = 0x7fff // limits mem size of a object to 32K.  Leaves the upper bit for a flag (used to have some, none at the moment).
  104. };
  105. /// Stores the object's size for use by the memory manager.
  106. /// See the hkBase user guide to find out more about this.
  107. /// Top bit is used as a flag (no current internal usage)
  108. /// Bottom 15 bits are for the memory size.
  109. /// A memory size of 0 is a special case and indicates
  110. /// that the object should not be freed (as it has
  111. /// probably been read in from a packed file for instance)
  112. hkUint16 m_memSizeAndFlags; //+nosave
  113. /// Reference count. Note that if m_memSizeAndFlags == 0,
  114. /// reference counting is disabled for this object.
  115. mutable hkInt16 m_referenceCount; //+nosave
  116. public:
  117. hkReferencedObject( class hkFinishLoadedObjectFlag flag ) {}
  118. };
  119. #include <Common/Base/Object/hkReferencedObject.inl>
  120. #endif // HKBASE_HKREFERENCEDOBJECT_H
  121. /*
  122. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  123. * Confidential Information of Havok.  (C) Copyright 1999-2009
  124. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  125. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  126. * rights, and intellectual property rights in the Havok software remain in
  127. * Havok and/or its suppliers.
  128. * Use of this software for evaluation purposes is subject to and indicates
  129. * acceptance of the End User licence Agreement for this product. A copy of
  130. * the license is included with this software and is also available at www.havok.com/tryhavok.
  131. */