Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

93 lines
2.2 KiB

//----------------------------------------------------------------------------
//
// Specialized allocators.
//
// Copyright (C) Microsoft Corporation, 2001.
//
//----------------------------------------------------------------------------
#ifndef __ALLOC_HPP__
#define __ALLOC_HPP__
//----------------------------------------------------------------------------
//
// FixedSizeStackAllocator.
//
// Parcels out memory chunks in strict LIFO allocation order.
// This could easily be generalized to mixed allocation sizes
// but then the size of each allocation would have to be tracked.
//
//----------------------------------------------------------------------------
struct FixedSizeStackBlock
{
FixedSizeStackBlock* Next;
PUCHAR MemLimit;
};
class FixedSizeStackAllocator
{
public:
FixedSizeStackAllocator(ULONG ChunkSize, ULONG ChunksPerBlock,
BOOL KeepLastBlock);
~FixedSizeStackAllocator(void);
void* Alloc(void)
{
if (!m_Blocks ||
m_Blocks->MemLimit >= (PUCHAR)m_Blocks + m_BlockSize)
{
if (!AllocBlock())
{
return NULL;
}
}
void* Mem = m_Blocks->MemLimit;
m_Blocks->MemLimit += m_ChunkSize;
m_NumAllocs++;
return Mem;
}
void Free(void* Mem)
{
if (!Mem)
{
return;
}
DBG_ASSERT(m_Blocks->MemLimit - m_ChunkSize == (PUCHAR)Mem);
m_NumAllocs--;
m_Blocks->MemLimit = (PUCHAR)Mem;
if (m_Blocks->MemLimit == (PUCHAR)(m_Blocks + 1))
{
FreeBlock();
}
}
void FreeAll(void);
ULONG NumAllocatedChunks(void)
{
return m_NumAllocs;
}
protected:
// Base methods use malloc/free.
virtual void* RawAlloc(ULONG Bytes);
virtual void RawFree(void* Mem);
private:
FixedSizeStackBlock* AllocBlock(void);
void FreeBlock(void);
ULONG m_ChunkSize;
BOOL m_KeepLastBlock;
ULONG m_BlockSize;
ULONG m_NumAllocs;
FixedSizeStackBlock* m_Blocks;
};
#endif // #ifndef __ALLOC_HPP__