hkFreeListMemory.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_FREELIST_MEMORY
  9. #define HK_FREELIST_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. #include <Common/Base/Memory/Memory/FreeList/hkFreeList.h>
  14. #include <Common/Base/Memory/Memory/FreeList/hkLargeBlockAllocator.h>
  15. //This table is created if the statistics are enabled
  16. //it is not accessed otherwise
  17. #include <Common/Base/Memory/MemoryClasses/hkMemoryClassesTable.h>
  18. extern hkMemoryClassInfo hkMemoryClassesTable[];
  19. /// This class implements the hkMemory interface, and uses freelists as the basis of 
  20. /// small memory allocations, and the large block allocator for large memory allocations.
  21. ///
  22. /// NOTE! Changing the hard memory limit - actually will set the memory limit on the hkMemoryBlockServer
  23. /// that the hkFreeListMemory uses for underlying memory. This class caches this as the 'hard memory limit' 
  24. /// in the constructor. If you try changing the limit in the server - this will not be seen by the 
  25. /// instance of hkFreeListMemory and so in general will cause incorrect behaviour. 
  26. /// Therefore change memory limits only thru the setMemoryHardLimit method and not directly on the 
  27. /// server.
  28. class hkFreeListMemory : public hkMemory, public hkLargeBlockLimitedMemoryListener
  29. {
  30. public:
  31. HK_DECLARE_SYSTEM_ALLOCATOR();
  32. /// Specify the server that we are using
  33. hkFreeListMemory(hkMemoryBlockServer* server, int maxNumberofElemsOnFreeList = hkMemory::DEFAULT_MAX_NUM_ELEMS_ON_THREAD_MEMORY_FREE_LIST );
  34. ~hkFreeListMemory();
  35. // hkLargeBlockLimitedMemoryListener interface implementation
  36. virtual void cannotAllocate(hk_size_t size);
  37. virtual void allocationFailure(hk_size_t size);
  38. // hkMemory interface implementation
  39. virtual void allocateChunkBatch(void** blocksOut, int nblocks, int nbytes, HK_MEMORY_CLASS cl);
  40. virtual void deallocateChunkBatch(void** blocks, int nblocks, int nbytes, HK_MEMORY_CLASS cl);
  41. virtual void* allocateChunk(int nbytes, HK_MEMORY_CLASS cl);
  42. virtual void deallocateChunk(void*, int nbytes, HK_MEMORY_CLASS cl);
  43. virtual void printStatistics(hkOstream* c);
  44. virtual int getAllocatedSize(int nbytes);
  45. virtual void reservePagesFromSystemMemory(int numBytes);
  46. virtual void garbageCollect();
  47. virtual void optimize();
  48. virtual void setMemorySoftLimit(hk_size_t maxMemory);
  49. virtual hk_size_t getMemorySoftLimit();
  50. virtual void setMemoryHardLimit(hk_size_t maxMemory);
  51. virtual hk_size_t getMemoryHardLimit();
  52. virtual hkBool hasMemoryAvailable(hk_size_t size);
  53. virtual void releaseUnusedPagesToSystemMemory( void );
  54. virtual void preAllocateRuntimeBlock(int nbytes, HK_MEMORY_CLASS cl);
  55. virtual void* allocateRuntimeBlock(int nbytes, HK_MEMORY_CLASS cl);
  56. virtual void deallocateRuntimeBlock(void*, int nbytes, HK_MEMORY_CLASS cl);
  57. virtual void provideRuntimeBlock(void*, int nbytes, HK_MEMORY_CLASS cl);
  58. virtual void freeRuntimeBlocks();
  59. virtual void setLimitedMemoryListener(hkLimitedMemoryListener* listener);
  60. virtual hkLimitedMemoryListener* getLimitedMemoryListener();
  61. virtual hkBool isOk() const;
  62. virtual void calculateStatistics(hkMemoryStatistics& stats);
  63. virtual hkResult walkMemory(hkMemoryWalkCallback callback,void* param);
  64. protected:
  65. mutable hkCriticalSection m_criticalSection;
  66. /// NOTE! The new/delete are special they are designed to use a restricted memory system, such that
  67. /// memory freed with _deleteFreeList will only be available if it was the last allocation. Ie its organised
  68. /// like stack memory
  69. /// Uses the simple contained memory allocation scheme
  70. /// Also ensures there is only one freelist for each element size
  71. hkFreeList* _newFreeList(hk_size_t elementSize,hk_size_t alignment,hk_size_t blockSize);
  72. /// Deletes the freelist, without using up memory
  73. void _deleteFreeList(hkFreeList* freeList);
  74. static HK_FORCE_INLINE hkBool _comparePointers( void* a, void* b ) { return (char*)a < (char*)b; }
  75. hkBool _hasMemoryAvailable(hk_size_t size);
  76. enum
  77. {
  78. /// The size smallest differential freelist size
  79. FREELIST_ALIGNMENT = 16,
  80. /// The maximum memory allocation size that will be handled via a freelist -> the rest go to the large
  81. /// block allocator
  82. /// The size is designed to be big enough to hold a complete hkpRigidBody in free list
  83. MAX_FREELIST_SIZE = hkThreadMemory::MEMORY_MAX_SIZE_SMALL_BLOCK,
  84. /// Shift to go from a size to a freelist
  85. FREELIST_SHIFT = 4,
  86. /// The total amount of size->freelist lookup entries
  87. MAX_FREELISTS = (MAX_FREELIST_SIZE >> FREELIST_SHIFT)+1,
  88. /// The total amount of unique freelists that is supported
  89. MAX_UNIQUE_FREELISTS = 32 + 2
  90. };
  91. /// The server being used
  92. hkMemoryBlockServer* m_server;
  93. /// The large block allocator
  94. hkLargeBlockAllocator m_largeAllocator;
  95. /// Freelists for the small sizes
  96. hkFreeList* m_sizeToFreeList[MAX_FREELISTS];
  97. hkFreeList* m_freeLists[MAX_FREELISTS];
  98. int m_numFreeLists;
  99. // We want this allocator to be self contained. So the memory to actually hold the freelists is allocated on
  100. // here. We just use a simple stack style memory allocation scheme to store the freelist objects
  101. hkFreeList* m_topFreeList;
  102. hkFreeList* m_lastFreeList;
  103. hkFreeList* m_freeListMemory;
  104. hkLimitedMemoryListener* m_listener;
  105. hk_size_t m_softLimit;
  106. hk_size_t m_hardLimit;
  107. };
  108. #endif // HK_FREELIST_MEMORY
  109. /*
  110. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  111. * Confidential Information of Havok.  (C) Copyright 1999-2009
  112. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  113. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  114. * rights, and intellectual property rights in the Havok software remain in
  115. * Havok and/or its suppliers.
  116. * Use of this software for evaluation purposes is subject to and indicates
  117. * acceptance of the End User licence Agreement for this product. A copy of
  118. * the license is included with this software and is also available at www.havok.com/tryhavok.
  119. */