view 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
line wrap: on
line source
1 // MemBlocks.h
3 #ifndef __MEMBLOCKS_H
4 #define __MEMBLOCKS_H
6 extern "C"
7 {
8 #include "../../../C/Alloc.h"
9 }
11 #include "Common/Types.h"
12 #include "Common/MyVector.h"
14 #include "Windows/Synchronization.h"
16 #include "../IStream.h"
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(); }
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 };
35 class CMemBlockManagerMt: public CMemBlockManager
36 {
37 NWindows::NSynchronization::CCriticalSection _criticalSection;
38 public:
39 NWindows::NSynchronization::CSemaphore Semaphore;
41 CMemBlockManagerMt(size_t blockSize = (1 << 20)): CMemBlockManager(blockSize) {}
42 ~CMemBlockManagerMt() { FreeSpace(); }
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 };
53 class CMemBlocks
54 {
55 void Free(CMemBlockManagerMt *manager);
56 public:
57 CRecordVector<void *> Blocks;
58 UInt64 TotalSize;
60 CMemBlocks(): TotalSize(0) {}
62 void FreeOpt(CMemBlockManagerMt *manager);
63 HRESULT WriteToStream(size_t blockSize, ISequentialOutStream *outStream) const;
64 };
66 struct CMemLockBlocks: public CMemBlocks
67 {
68 bool LockMode;
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 };
77 #endif