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

其他游戏

开发平台:

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_POOL_MEMORY
  9. #define HK_POOL_MEMORY
  10. #include <Common/Base/Memory/Memory/hkMemory.h>
  11. #include <Common/Base/Thread/CriticalSection/hkCriticalSection.h>
  12. #include <Common/Base/Config/hkConfigMemoryStats.h>
  13. //This table is created if the statistics are enabled
  14. //it is not accessed otherwise
  15. #include <Common/Base/Memory/MemoryClasses/hkMemoryClassesTable.h>
  16. extern hkMemoryClassInfo hkMemoryClassesTable[];
  17. /// The default Havok memory manager.
  18. /// This manager requests fixed size blocks from the system allocator
  19. /// (hkSystemMalloc) and manages these blocks. Memory is not returned
  20. /// until the destructor. Blocks larger than this block size (currently
  21. /// 8192 bytes) are forwarded directly to the system allocator.
  22. /// The pool can be preloaded based on previous runs. See the user guide.
  23. /// This memory manager fills free and uninitialized memory when HK_DEBUG
  24. /// is defined. See hkMemory::MemoryFill for the values.
  25. class hkPoolMemory : public hkMemory
  26. {
  27. public:
  28.     HK_DECLARE_SYSTEM_ALLOCATOR();
  29. hkPoolMemory( int maxNumElemsOnThreadMemoryFreeList = hkMemory::DEFAULT_MAX_NUM_ELEMS_ON_THREAD_MEMORY_FREE_LIST );
  30. ~hkPoolMemory();
  31. virtual void allocateChunkBatch(void** blocksOut, int nblocks, int nbytes, HK_MEMORY_CLASS cl );
  32. virtual void deallocateChunkBatch(void** blocks, int nblocks, int nbytes, HK_MEMORY_CLASS cl );
  33. virtual void* allocateChunk(int nbytes, HK_MEMORY_CLASS cl);
  34. virtual void deallocateChunk(void*, int nbytes, HK_MEMORY_CLASS cl);
  35. virtual void printStatistics(hkOstream* c);
  36. virtual int getAllocatedSize( int nbytes );
  37. /// Preallocate and reserves a number of memory pages.
  38. /// Reserving memory in this way should avoid memory fragmentation.
  39. virtual void reservePagesFromSystemMemory( int numBytes );
  40. /// This call tries to find completely empty pages in the Havok memory
  41. /// and adds them to the reserved list.
  42.     virtual void garbageCollect( void );
  43. /// This system frees the memory reserved on the reserved list back to the system.
  44. virtual void releaseUnusedPagesToSystemMemory( void );
  45. virtual void preAllocateRuntimeBlock(int nbytes, HK_MEMORY_CLASS cl);
  46. virtual void* allocateRuntimeBlock(int nbytes, HK_MEMORY_CLASS cl);
  47. virtual void deallocateRuntimeBlock(void*, int nbytes, HK_MEMORY_CLASS cl);
  48. virtual void provideRuntimeBlock(void*, int nbytes, HK_MEMORY_CLASS cl);
  49. virtual void freeRuntimeBlocks();
  50.     virtual void calculateStatistics(hkMemoryStatistics& stats);
  51.     virtual void setLimitedMemoryListener(hkLimitedMemoryListener* listener);
  52.     virtual hkLimitedMemoryListener* getLimitedMemoryListener();
  53.     virtual void setMemorySoftLimit(hk_size_t maxMemory);
  54.     virtual hk_size_t getMemorySoftLimit();
  55.     virtual void setMemoryHardLimit(hk_size_t maxMemory);
  56.     virtual hk_size_t getMemoryHardLimit();
  57.     virtual hkBool hasMemoryAvailable(hk_size_t size);
  58. virtual void optimize();
  59. inline int getMemoryUsed() const
  60. {
  61. return m_pageMemoryUsed + m_sysAllocsSize;
  62. }
  63. protected:
  64.     void _setMemorySoftLimit(hk_size_t maxMemory);
  65.     void _setMemoryHardLimit(hk_size_t maxMemory);
  66. void putOnFreeList(void* p, int row);
  67. //update the stats when an allocate occurs (will do nothing if stats not enabled)
  68. void updateStatsAllocate(int nbytes, HK_MEMORY_CLASS cl);
  69. //update the stats when a deallocate occurs (will do nothing if stats not enabled)
  70. void updateStatsDeallocate(int nbytes, HK_MEMORY_CLASS cl);
  71. //fetch statistics info for a class (will do nothing if stats not enabled)
  72. hkMemoryClassInfo* getInfo(int classID);
  73. //when collating statistics, the stats should be propagated from subclasses to superclasses
  74. void propogateStatsUp();
  75. // When finished collating, we must undo these additions
  76. void undoPropogate();
  77. // Print out the memory class hierarchy
  78. void printMemoryClassTree(hkOstream* c,int id, int level);
  79. // return the row of the free list for a given size
  80. HK_FORCE_INLINE int getRow(int nbytes)
  81. {
  82. return (nbytes <= hkThreadMemory::MEMORY_MAX_SIZE_SMALL_BLOCK)
  83. ? int(m_small_size_to_row_lut[nbytes])
  84. : m_large_size_to_row_lut[ (nbytes-1) >> hkThreadMemory::MEMORY_LARGE_BLOCK_RSHIFT_BITS];
  85. }
  86. public:
  87. struct MemoryElem
  88. {
  89. // NEVER NEW THIS
  90. MemoryElem *m_next;
  91. };
  92. /// A header for each system allocation
  93. struct hkMemoryPage
  94. {
  95. // NEVER NEW THIS
  96. hkMemoryPage* m_next;
  97. hkInt32 m_pad[(hkThreadMemory::PAGE_ALIGN - hkSizeOf(hkMemoryPage*))/ hkSizeOf(hkInt32)];
  98. };
  99. enum { CHOP_SIZE = 512 };
  100. private:
  101. HK_FORCE_INLINE hkMemoryPage* getNewPage ( void );
  102. HK_FORCE_INLINE void* _allocate_and_chop_page( int row );
  103. HK_FORCE_INLINE void _putOnFreeList(void* p, int row);
  104. HK_FORCE_INLINE void _updateStatsAllocate(int nbytes, HK_MEMORY_CLASS cl);
  105. HK_FORCE_INLINE void _updateStatsDeallocate(int nbytes, HK_MEMORY_CLASS cl);
  106. HK_FORCE_INLINE hkMemoryClassInfo* _getInfo(int classID);
  107. protected:
  108.     inline int getSizeAllocatedByMemoryManager() const
  109.     {
  110.         return (m_sizeOfPage + m_pageOverhead) * m_numPages + m_sysAllocsSize;
  111.     }
  112.         /// Returns the size which is allocated within the memory manager.
  113.         /// Note: If you allocate a block of size 3, it will be padded to 4 bytes
  114.         /// and 4 will be added to m_pageMemoryUsed
  115.     
  116.         /// Works out the size in bytes of all the memory in use for page memory
  117.     hk_size_t _calculatePageSizeInUse();
  118. /// List of all pages allocated
  119. hkMemoryPage* m_allocated_memory_pages;
  120. /// List of all 8K pages which are allocated, which
  121. /// are not in use by the pool memory.
  122. hkMemoryPage* m_reserved_memory_pages;
  123. // Pointers to the start,end and current position in the current page
  124. // we make them char* instead of void* because ansi c++ does not permit
  125. // pointer arithmetic on void pointers
  126. char* m_current_page_start;
  127. char* m_current_page_end;
  128. char* m_current_page_space;
  129. hkCriticalSection m_criticalSection;
  130. /// Free list for blocks of each size
  131. MemoryElem* m_free_list[hkThreadMemory::MEMORY_MAX_ALL_ROW];
  132. /// A lookup table of size of each block size
  133. int m_row_to_size_lut[hkThreadMemory::MEMORY_MAX_ALL_ROW];
  134. /// A lookup table of sizes to small block size
  135. char m_small_size_to_row_lut[hkThreadMemory::MEMORY_MAX_SIZE_SMALL_BLOCK+1];
  136. /// A lookup table of sizes to large block size
  137. int m_large_size_to_row_lut[ (hkThreadMemory::MEMORY_MAX_SIZE_LARGE_BLOCK >> hkThreadMemory::MEMORY_LARGE_BLOCK_RSHIFT_BITS) ];
  138. /// Statistics for blocks of each size
  139. int m_blocks_in_use[hkThreadMemory::MEMORY_MAX_ALL_ROW];
  140.         /// The total number of memory allocations bypassing the pool memory and going
  141.         /// directly to the system memory. If you use the hkPoolMemory, then very big
  142.         /// allocations (greater then 8K) can't be handled by the pool and have to go
  143.         /// to the system memory
  144.     int m_numSysAllocs;
  145.         /// The total number of bytes allocated by the system memory
  146.     int m_sysAllocsSize;
  147.         /// The current maximum of the total number of bytes allocated by the system memory
  148.     int m_sysAllocsHighMark;
  149.         /// The number of pages allocated by the pool memory
  150.     int m_numPages;
  151.         /// Size of one page without overhead
  152.     int m_sizeOfPage;
  153.         /// Size of the overhead
  154.     int m_pageOverhead;
  155.         /// Bytes allocated within the pool memory
  156.     int m_pageMemoryUsed;
  157.         /// Limited memory listener
  158.     hkLimitedMemoryListener* m_listener;
  159.         /// The limit of memory available. If 0 there is no imposed limit
  160.     hk_size_t m_hardLimit;
  161.     hk_size_t m_softLimit;
  162. };
  163. #endif // HK_POOL_MEMORY
  164. /*
  165. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  166. * Confidential Information of Havok.  (C) Copyright 1999-2009
  167. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  168. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  169. * rights, and intellectual property rights in the Havok software remain in
  170. * Havok and/or its suppliers.
  171. * Use of this software for evaluation purposes is subject to and indicates
  172. * acceptance of the End User licence Agreement for this product. A copy of
  173. * the license is included with this software and is also available at www.havok.com/tryhavok.
  174. */