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