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.
 
 
 
 
 
 

147 lines
4.0 KiB

/*==========================================================================
*
* Copyright (C) 1995 - 2000 Microsoft Corporation. All Rights Reserved.
*
* File: templatepools.h
* Content: Templated based pool objects derived from CFixedPool
*
* History:
* Date By Reason
* ====== == ======
* 12-10-2001 simonpow Created
***************************************************************************/
#ifndef __TEMPLATEPOOLS_H__
#define __TEMPLATEPOOLS_H__
/*
* Usage Notes
* There are three different pool types -
* CObjectFixedPool, CDataBlockFixedPool, CMemBlockFixedPool
* They all basically do the same thing, which is to provide a very thin wrapper
* on CFixedPool, a wrapper which in turn imposes a certain usage policy.
*
* CObjectFixedPool ensures the templated object type is correctly constructed and
* destructed on a pool alloc/dealloc. It forwards pool Init/Release calls
* to FPMInitialize and FPMRelease methods on the templated object
*
* CDataBlockFixedPool doesn't provide any construction/destruction support, it
* simply forwards the pool Init/Release calls to FPMInitialize and FPMRelease methods
*
* CMemBlockFixedPool doesn't provide any alloc/dealloc/init/release methods. It assumes
* the user simply wants raw memory chunks
*/
#include "fixedpool.h"
//placement new operator. Used to construct objects at location provided
//from CFixedPool base class
inline void * operator new(size_t sz, void * v)
{ return v; };
/*
* CObjectFixedPool
* Object allocated through this must provide a default constructor, a destructor,
* a FPMInitialize method and an FPMRelease method
*/
template <class T>
class CObjectFixedPool : protected CFixedPool
{
public:
CObjectFixedPool() : CFixedPool() {};
~CObjectFixedPool() {};
BOOL Initialize()
{ return CFixedPool::Initialize(sizeof(T), FPMAlloc, FPMInitialize, FPMRelease, FPMDealloc); };
void DeInitialize()
{ CFixedPool::DeInitialize(); };
T * Get()
{ return (T* ) CFixedPool::Get(); };
void Release(T * pItem)
{ CFixedPool::Release(pItem); };
DWORD GetInUseCount()
{ return FixedPool::GetInUseCount(); };
protected:
static BOOL FPMAlloc(void * pvItem, void * pvContext)
{ new (pvItem) T(); return TRUE; };
static void FPMInitialize(void * pvItem, void * pvContext)
{ ((T * ) pvItem)->FPMInitialize(); };
static void FPMRelease(void * pvItem)
{ ((T * ) pvItem)->FPMRelease(); };
static void FPMDealloc(void * pvItem)
{ ((T * ) pvItem)->~T(); };
};
/*
* CDataBlockFixedPool
* Object allocated through this must provide a FPMInitialize method and an
* FPMRelease method. Their constructor/destructor will not be called
*/
template <class T>
class CDataBlockFixedPool : protected CFixedPool
{
public:
CDataBlockFixedPool() : CFixedPool() {};
~CDataBlockFixedPool() {};
BOOL Initialize()
{ return CFixedPool::Initialize(sizeof(T), NULL, FPMInitialize, FPMRelease, NULL); };
void DeInitialize()
{ CFixedPool::DeInitialize(); };
T * Get()
{ return (T* ) CFixedPool::Get(); };
void Release(T * pItem)
{ CFixedPool::Release(pItem); };
DWORD GetInUseCount()
{ return FixedPool::GetInUseCount(); };
protected:
static void FPMInitialize(void * pvItem, void * pvContext)
{ ((T * ) pvItem)->FPMInitialize(); };
static void FPMRelease(void * pvItem)
{ ((T * ) pvItem)->FPMRelease(); };
};
/*
* CMemBlockFixedPool
* Object allocated through this will have no initialisation done
*/
template <class T>
class CMemBlockFixedPool : protected CFixedPool
{
public:
CMemBlockFixedPool() : CFixedPool() {};
~CMemBlockFixedPool() {};
BOOL Initialize()
{ return CFixedPool::Initialize(sizeof(T), NULL, NULL, NULL, NULL); };
void DeInitialize()
{ CFixedPool::DeInitialize(); };
T * Get()
{ return (T* ) CFixedPool::Get(); };
void Release(T * pItem)
{ CFixedPool::Release(pItem); };
DWORD GetInUseCount()
{ return FixedPool::GetInUseCount(); };
};
#endif //#ifndef __TEMPLATEPOOLS_H__