hkFreeList.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_FREELIST
  9. #define HK_FREELIST
  10. #include <Common/Base/Memory/Memory/hkMemory.h>
  11. #include <Common/Base/Memory/Memory/FreeList/hkFreeListMemoryServer.h>
  12. /// Fast fixed memory size allocations - used in the hkFreeListMemory for small memory block allocations.
  13. ///
  14. /// Can be used where ever you want fast same block size allocations, and you want to be able to free blocks
  15. /// in any order when they are not in use.
  16. ///
  17. /// This implementation is particularly fast at initial allocation - as it works just like a 'region'.
  18. /// If memory is allocated and freed, the freelist uses a linked list of available blocks which whilst fast isn't
  19. /// as fast as region style allocation. Doing a a findGarbage will turn all memory that can be used as a region
  20. /// into a region.
  21. ///
  22. /// NOTE! Freeing freelist blocks does not free memory back to the allocator. Memory is only given back to the
  23. /// hkFreeListAllocator when a garbageCollect or freeAllFreeBlocks is called.
  24. class hkFreeList
  25. {
  26.     public:
  27.         HK_DECLARE_SYSTEM_ALLOCATOR();
  28.             /// The size of an element, and the alignment all elements must have
  29.         hkFreeList(hk_size_t elementSize,hk_size_t alignment,hk_size_t blockSize,
  30.             hkFreeListMemoryServer* alloc = &hkDefaultFreeListMemoryServer::getInstance());
  31.         ~hkFreeList() { freeAllMemory(); }
  32.         struct Element
  33.         {
  34.             Element* m_next;
  35.         };
  36.             // The block is 16 byte aligned, as are allocations from the large block allocator. Which is nice - and a
  37.             // requirement for the alignment.
  38.         struct Block
  39.         {
  40.                 // The next block in the list, or NULL if there isn't one
  41.             Block* m_next;
  42.                 // Total amount of memory in bytes allocated to this block
  43.             hk_size_t m_blockSize;
  44.                 // The start of the payload
  45.             hkUint8* m_start;
  46.                 // Number of elements in this block
  47.             hk_size_t m_numElements;
  48.         };
  49.             /// Allocates a chunk of memory
  50.         HK_FORCE_INLINE void* alloc();
  51.             /// Returns the chunk of memory to the pool. The chunk _must_ have been allocated from this pool
  52.         HK_FORCE_INLINE void free(void* data);
  53.             /// Allocate a batch
  54.         HK_FORCE_INLINE void allocBatch(void** out,int sizeIn);
  55.             /// Free a batch
  56.         HK_FORCE_INLINE void freeBatch(void** in,int sizeIn);
  57.             /// Frees all of the memory used by the memory pool
  58.         void freeAllMemory();
  59.             /// Makes all of the memory allocated available
  60.         void freeAll();
  61.             /// Get the element size
  62.         hk_size_t getElementSize() const { return m_elementSize; }
  63.             /// Does checks to see if this memory is ok
  64.         hkBool isOk() { return _checkFreeBlocks(); }
  65.             /// Returns true if there is an element available (without extra allocation)
  66.         hkBool isFreeElementAvailable() const { return m_free || m_top < m_blockEnd; }
  67.             /// Simple memory stats
  68.         void calculateStatistics(hkMemoryStatistics& stats);
  69.             /// Finds blocks which are not used, and puts them on the 'freeBlocks' list
  70.             /// Returns number of blocks found, or <0 if couldn't do the work
  71.         int findGarbage();
  72.             /// Collect
  73.         inline void garbageCollect();
  74.             /// Frees all of the free blocks
  75.         int freeAllFreeBlocks();
  76.             /// Returns true if there are freeblocks in the list
  77.         hkBool hasFreeBlocks() const { return m_freeBlocks != HK_NULL; }
  78.             /// Free any blocks smaller than minSize
  79.         void freeSmallFreeBlocks(hk_size_t minSize);
  80.             /// Get the total amount of free elements that are available
  81.         hk_size_t getNumFreeElements() const { return m_numFreeElements; }
  82.             /// Get the total mumber of elements, free and used that have been allocated
  83.         hk_size_t getTotalNumElements() const { return m_totalNumElements; }
  84.             /// Get the total number of elements that have been used
  85.         hk_size_t getNumUsedElements() const { return m_totalNumElements - m_numFreeElements; }
  86.             /// Get the current allocation block size
  87.         hk_size_t getBlockSize() const { return m_blockSize; }
  88.         int _getTotalNumBlocks(Block* blocks) const
  89.         {
  90.             int num = 0;
  91.             while (blocks)
  92.             {
  93.                 num++;
  94.                 blocks = blocks->m_next;
  95.             }
  96.             return num;
  97.         }
  98.             /// returns the total amount of blocks (NOT ELEMENTS)
  99.         int getTotalNumBlocks() const { return _getTotalNumBlocks(m_freeBlocks) + _getTotalNumBlocks(m_blocks); }
  100.             /// returns pointers to all the allocations large allocations (NOT ELEMENTS), numBlocks must be the same as what was returned
  101.             /// from getTotalNumBlocks
  102.         void getBlocks(void** blocks,int numBlocks);
  103.             /// Will callback for each free and allocated memory block
  104.         void walkMemory(hkMemoryWalkCallback callback,int pool,void* param);
  105.             /// Blocksize for elements
  106.         static hk_size_t bestBlockSize(hk_size_t elementSpace,hk_size_t align);
  107.         protected:
  108.             // Make more space and return a new block from the space that was allocated. If not possible to allocate
  109.             // return HK_NULL
  110.         void* addSpace();
  111.             // Returns the amount free elements
  112.         hk_size_t _calcNumFreeElements() const;
  113.             // Returns the total amount elements, free or used
  114.         hk_size_t _calcTotalNumElements() const;
  115.             // Returns the number of used elements
  116.         hk_size_t _calcNumUsedElements() const { return _calcTotalNumElements() - _calcNumFreeElements(); }
  117.             // Goes down the linked list working out how many elements there are
  118.         static hk_size_t _calcTotalNumElements(Block* cur);
  119.             // Frees a link list of blocks
  120.         int _freeBlocks(Block* cur);
  121.             // Calculates the sum size of a linked list of blocks
  122.         hk_size_t _calculateBlocksTotalSize(Block* cur);
  123.         static HK_FORCE_INLINE hkBool _compareBlocks( const Block* a, const Block* b ) { return a < b; }
  124.         static HK_FORCE_INLINE hkBool _compareElements( const Element* a, const Element* b ) { return a < b; }
  125.             /// Add all the elements of block to the free list
  126.         void _addBlockElements(Block* block)
  127.         {
  128.             m_top = block->m_start;
  129.             m_blockEnd = block->m_start + block->m_numElements * m_elementSize;
  130.         }
  131.         void  _walkMemoryBlockList(Block* block,hkMemoryWalkCallback callback,int pool,void* param);
  132.         hkBool _checkFreeBlocks();
  133.     protected:
  134.             // Singly linked list of free elements. NULL terminated
  135.         Element* m_free;
  136.             // The size of a single element
  137.         hk_size_t m_elementSize;
  138.             // The active blocks
  139.         Block* m_blocks;
  140.             // The free blocks (blocks which haven't seen use in current allocation)
  141.         Block* m_freeBlocks;
  142.         hk_size_t m_blockSize;
  143.         hk_size_t m_align;
  144.         hk_size_t m_maxBlockSize;
  145.             // The top of the current block, above it memory is free up until blockEnd is hit
  146.         hkUint8* m_top;
  147.         hkUint8* m_blockEnd;
  148.             // A cache of the total amount of free elements
  149.         hk_size_t m_numFreeElements;
  150.             // A cached value of the total amount of elements
  151.         hk_size_t m_totalNumElements;
  152.             // The large block allocator
  153.         hkFreeListMemoryServer* m_memoryServer;
  154. };
  155. #include <Common/Base/Memory/Memory/FreeList/hkFreeList.inl>
  156. #endif // HK_FREELIST
  157. /*
  158. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  159. * Confidential Information of Havok.  (C) Copyright 1999-2009
  160. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  161. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  162. * rights, and intellectual property rights in the Havok software remain in
  163. * Havok and/or its suppliers.
  164. * Use of this software for evaluation purposes is subject to and indicates
  165. * acceptance of the End User licence Agreement for this product. A copy of
  166. * the license is included with this software and is also available at www.havok.com/tryhavok.
  167. */