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