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

其他游戏

开发平台:

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. int hkThreadMemory::getRow(int nbytes) const
  9. {
  10. return (nbytes <= MEMORY_MAX_SIZE_SMALL_BLOCK)
  11. ? int(m_small_size_to_row_lut[(nbytes + MEMORY_SMALL_BLOCK_ADD) >> MEMORY_SMALL_BLOCK_RSHIFT_BITS])
  12. : m_large_size_to_row_lut[ (nbytes-1) >> MEMORY_LARGE_BLOCK_RSHIFT_BITS];
  13. }
  14. int hkThreadMemory::rowToSize( int row ) const
  15. {
  16. return m_row_to_size_lut[row];
  17. }
  18. hkThreadMemory::Stack& HK_CALL hkThreadMemory::getStack()
  19. {
  20. return m_stack;
  21. }
  22. int hkThreadMemory::constSizeToRow( int size )
  23. {
  24. HK_ASSERT(0x2a4ab5b6, size <= hkThreadMemory::MEMORY_MAX_SIZE_LARGE_BLOCK );
  25. HK_ASSERT(0x5dee00b2, hkThreadMemory::MEMORY_MAX_ALL_ROW == 17);
  26. if (size <= 16 ) return 1;
  27. else if (size <= 32 ) return 2;
  28. else if (size <= 48 ) return 3;
  29. else if (size <= 64 ) return 4;
  30. else if (size <= 96 ) return 5;
  31. else if (size <= 128 ) return 6;
  32. else if (size <= 160 ) return 7;
  33. else if (size <= 192 ) return 8;
  34. else if (size <= 256 ) return 9;
  35. else if (size <= 320 ) return 10;
  36. else if (size <= 512 ) return 11;
  37. else if (size <= hkThreadMemory::MEMORY_MAX_SIZE_SMALL_BLOCK) return 12; // end small blocks (this is especially for hkpRigidBody)
  38. else if (size <= 1024) return 13;
  39. else if (size <= 2048) return 14;
  40. else if (size <= 4096) return 15;
  41. else if (size <= 8192) return 16; // end large blocks.
  42. else
  43. {
  44. HK_BREAKPOINT(0);
  45. return -1;
  46. }
  47. }
  48. void* hkThreadMemory::allocateChunkConstSize(int nbytes, HK_MEMORY_CLASS cl)
  49. {
  50. HK_ASSERT2( 0xf0432dad, nbytes <= MEMORY_MAX_SIZE_LARGE_BLOCK, "The nbytes is limited, use allocateChunk() instead" );
  51. int row = constSizeToRow(nbytes);
  52. if( void* p = m_free_list[row].get() )
  53. {
  54. return p;
  55. }
  56. return onRowEmpty(row, cl);
  57. }
  58. void hkThreadMemory::deallocateChunkConstSize(void* p, int nbytes, HK_MEMORY_CLASS cl)
  59. {
  60. HK_ASSERT2( 0xdbc47747, p, "hkThreadMemory::deallocateChunkConstSize cannot deallocate a null pointer");
  61. HK_ASSERT2( 0xf0432dad, nbytes <= MEMORY_MAX_SIZE_LARGE_BLOCK, "The nbytes is limited to " << MEMORY_MAX_SIZE_LARGE_BLOCK << ", use deallocateChunk() instead" );
  62. int row = constSizeToRow(nbytes);
  63. if ( m_free_list[row].m_numElem >= m_maxNumElemsOnFreeList )
  64. {
  65. onRowFull(row, p, cl);
  66. }
  67. else
  68. {
  69. m_free_list[row].put(p);
  70. }
  71. }
  72. void* hkThreadMemory::allocateStack(int nbytesin)
  73. {
  74. // like HK_NEXT_MULTIPLE_OF, but always increases memory
  75. int actualBytes = (nbytesin+16) & (~((16)-1));
  76. char* p = m_stack.m_current;
  77. char* end = p + actualBytes;
  78. if( end <= m_stack.m_end )
  79. {
  80. m_stack.m_current = end;
  81. return p;
  82. }
  83. else
  84. {
  85. return onStackOverflow(actualBytes);
  86. }
  87. }
  88. void hkThreadMemory::shrinkAllocatedStack(void* ptr, int nbytesin)
  89. {
  90. int actualBytes = (nbytesin+16) & (~((16)-1)); // like HK_NEXT_MULTIPLE_OF, but always increases memory
  91. m_stack.m_current = static_cast<char*>(ptr) + actualBytes;
  92. }
  93. void hkThreadMemory::deallocateStack(void* p)
  94. {
  95. HK_ASSERT2( 0x61a78c09, p < m_stack.m_current, "stack deallocations out of order" );
  96. m_stack.m_current = static_cast<char*>(p);
  97. if( p == m_stack.m_base  )
  98. {
  99. onStackUnderflow(p);
  100. }
  101. }
  102. template <typename TYPE>
  103. HK_FORCE_INLINE TYPE* HK_CALL hkAllocateStack(int n, const char* what )
  104. {
  105. hkThreadMemory& mem = hkThreadMemory::getInstance();
  106. return static_cast<TYPE*>( mem.allocateStack(n*hkSizeOf(TYPE)) );
  107. }
  108. template <typename TYPE>
  109. HK_FORCE_INLINE void HK_CALL hkShrinkAllocatedStack(TYPE* ptr, int newSize )
  110. {
  111. hkThreadMemory& mem = hkThreadMemory::getInstance();
  112. mem.shrinkAllocatedStack(ptr, newSize*hkSizeOf(TYPE));
  113. }
  114. template <typename TYPE>
  115. HK_FORCE_INLINE void HK_CALL hkDeallocateStack(TYPE* ptr)
  116. {
  117. hkThreadMemory::getInstance().deallocateStack( static_cast<void*>(ptr) );
  118. }
  119. /*
  120. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  121. * Confidential Information of Havok.  (C) Copyright 1999-2009
  122. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  123. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  124. * rights, and intellectual property rights in the Havok software remain in
  125. * Havok and/or its suppliers.
  126. * Use of this software for evaluation purposes is subject to and indicates
  127. * acceptance of the End User licence Agreement for this product. A copy of
  128. * the license is included with this software and is also available at www.havok.com/tryhavok.
  129. */