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