1 // MemBlocks.h 2 3 #ifndef __MEM_BLOCKS_H 4 #define __MEM_BLOCKS_H 5 6 #include "../../Common/MyVector.h" 7 8 #include "../../Windows/Synchronization.h" 9 10 #include "../IStream.h" 11 12 class CMemBlockManager 13 { 14 void *_data; 15 size_t _blockSize; 16 void *_headFree; 17 public: 18 CMemBlockManager(size_t blockSize = (1 << 20)): _data(0), _blockSize(blockSize), _headFree(0) {} ~CMemBlockManager()19 ~CMemBlockManager() { FreeSpace(); } 20 21 bool AllocateSpace(size_t numBlocks); 22 void FreeSpace(); GetBlockSize()23 size_t GetBlockSize() const { return _blockSize; } 24 void *AllocateBlock(); 25 void FreeBlock(void *p); 26 }; 27 28 29 class CMemBlockManagerMt: public CMemBlockManager 30 { 31 NWindows::NSynchronization::CCriticalSection _criticalSection; 32 public: 33 NWindows::NSynchronization::CSemaphore Semaphore; 34 CMemBlockManager(blockSize)35 CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {} ~CMemBlockManagerMt()36 ~CMemBlockManagerMt() { FreeSpace(); } 37 38 HRes AllocateSpace(size_t numBlocks, size_t numNoLockBlocks = 0); 39 HRes AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0); 40 void FreeSpace(); 41 void *AllocateBlock(); 42 void FreeBlock(void *p, bool lockMode = true); ReleaseLockedBlocks(int number)43 HRes ReleaseLockedBlocks(int number) { return Semaphore.Release(number); } 44 }; 45 46 47 class CMemBlocks 48 { 49 void Free(CMemBlockManagerMt *manager); 50 public: 51 CRecordVector<void *> Blocks; 52 UInt64 TotalSize; 53 CMemBlocks()54 CMemBlocks(): TotalSize(0) {} 55 56 void FreeOpt(CMemBlockManagerMt *manager); 57 HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const; 58 }; 59 60 struct CMemLockBlocks: public CMemBlocks 61 { 62 bool LockMode; 63 CMemLockBlocksCMemLockBlocks64 CMemLockBlocks(): LockMode(true) {}; 65 void Free(CMemBlockManagerMt *memManager); 66 void FreeBlock(int index, CMemBlockManagerMt *memManager); 67 HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager); 68 void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager); 69 }; 70 71 #endif 72