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:
_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   HRes AllocateSpace(size_t numBlocks, size_t numNoLockBlocks);
40   HRes 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   // HRes SwitchToNoLockMode(CMemBlockManagerMt *memManager);
69   void Detach(CMemLockBlocks &blocks, CMemBlockManagerMt *memManager);
70 };
71 
72 #endif
73