xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/MemBlocks.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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