Mercurial > vba-linux
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.h3 #ifndef __MEMBLOCKS_H4 #define __MEMBLOCKS_H6 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 CMemBlockManager19 {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 CMemBlockManager36 {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 CMemBlocks54 {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 CMemBlocks67 {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