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