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.
|
|
/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
bsfixalloc.h
Abstract:
Adapted rom MFC fixalloc.h
Author:
Stefan R. Steiner [ssteiner] 04-10-2000
Revision History:
--*/
#ifndef __H_BSFIXALLOC_
#define __H_BSFIXALLOC_
// fixalloc.h - declarations for fixed block allocator
#pragma pack(push, 8)
struct CBsPlex // warning variable length structure
{ CBsPlex* pNext; DWORD dwReserved[1]; // align on 8 byte boundary
// BYTE data[maxNum*elementSize];
void* data() { return this+1; }
static CBsPlex* PASCAL Create(CBsPlex*& head, UINT nMax, UINT cbElement); // like 'calloc' but no zero fill
// may throw memory exceptions
void FreeDataChain(); // free this one and links
};
#pragma pack(pop)
/////////////////////////////////////////////////////////////////////////////
// CBsFixedAlloc
class CBsFixedAlloc { // Constructors
public: CBsFixedAlloc(UINT nAllocSize, UINT nBlockSize = 64);
// Attributes
UINT GetAllocSize() { return m_nAllocSize; }
// Operations
public: void* Alloc(); // return a chunk of memory of nAllocSize
void Free(void* p); // free chunk of memory returned from Alloc
void FreeAll(); // free everything allocated from this allocator
// Implementation
public: ~CBsFixedAlloc();
protected: struct CNode { CNode* pNext; // only valid when in free list
};
UINT m_nAllocSize; // size of each block from Alloc
UINT m_nBlockSize; // number of blocks to get at a time
CBsPlex* m_pBlocks; // linked list of blocks (is nBlocks*nAllocSize)
CNode* m_pNodeFree; // first free node (NULL if no free nodes)
CRITICAL_SECTION m_protect; };
#ifndef _DEBUG
// DECLARE_FIXED_ALLOC -- used in class definition
#define DECLARE_FIXED_ALLOC(class_name) \
public: \ void* operator new(size_t size) \ { \ ASSERT(size == s_alloc.GetAllocSize()); \ UNUSED(size); \ return s_alloc.Alloc(); \ } \ void* operator new(size_t, void* p) \ { return p; } \ void operator delete(void* p) { s_alloc.Free(p); } \ void* operator new(size_t size, LPCSTR, int) \ { \ ASSERT(size == s_alloc.GetAllocSize()); \ UNUSED(size); \ return s_alloc.Alloc(); \ } \ protected: \ static CBsFixedAlloc s_alloc \
// IMPLEMENT_FIXED_ALLOC -- used in class implementation file
#define IMPLEMENT_FIXED_ALLOC(class_name, block_size) \
CBsFixedAlloc class_name::s_alloc(sizeof(class_name), block_size) \
#else //!_DEBUG
#define DECLARE_FIXED_ALLOC(class_name) // nothing in debug
#define IMPLEMENT_FIXED_ALLOC(class_name, block_size) // nothing in debug
#endif //!_DEBUG
#endif // __H_BSFIXALLOC_
|