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