1 // MemBlocks.h 2 3 #ifndef ZIP7_INC_MEM_BLOCKS_H 4 #define ZIP7_INC_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: _data(NULL)18 CMemBlockManager(size_t blockSize = (1 << 20)): _data(NULL), _blockSize(blockSize), _headFree(NULL) {} ~CMemBlockManager()19 ~CMemBlockManager() { FreeSpace(); } 20 21 bool AllocateSpace_bool(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 SYNC_OBJ_DECL(Synchro) 34 NWindows::NSynchronization::CSemaphore_WFMO Semaphore; 35 CMemBlockManager(blockSize)36 CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {} ~CMemBlockManagerMt()37 ~CMemBlockManagerMt() { FreeSpace(); } 38 39 HRESULT AllocateSpace(size_t numBlocks, size_t numNoLockBlocks); 40 HRESULT AllocateSpaceAlways(size_t desiredNumberOfBlocks, size_t numNoLockBlocks = 0); 41 void FreeSpace(); 42 void *AllocateBlock(); 43 void FreeBlock(void *p, bool lockMode = true); 44 // WRes ReleaseLockedBlocks_WRes(unsigned number) { return Semaphore.Release(number); } 45 }; 46 47 48 class CMemBlocks 49 { 50 void Free(CMemBlockManagerMt *manager); 51 public: 52 CRecordVector<void *> Blocks; 53 UInt64 TotalSize; 54 CMemBlocks()55 CMemBlocks(): TotalSize(0) {} 56 57 void FreeOpt(CMemBlockManagerMt *manager); 58 HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const; 59 }; 60 61 struct CMemLockBlocks: public CMemBlocks 62 { 63 bool LockMode; 64 CMemLockBlocksCMemLockBlocks65 CMemLockBlocks(): LockMode(true) {} 66 void Free(CMemBlockManagerMt *memManager); 67 void FreeBlock(unsigned index, CMemBlockManagerMt *memManager); 68 // HRESULT SwitchToNoLockMode(CMemBlockManagerMt *memManager); 69 void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager); 70 }; 71 72 #endif 73