annotate 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
rev   line source
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