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.
 
 
 
 
 
 

106 lines
3.3 KiB

/*==========================================================================
*
* Copyright (C) 1995-2002 Microsoft Corporation. All Rights Reserved.
*
* File: fixedpool.h
* Content: fixed size pool manager
*
* History:
* Date By Reason
* ====== == ======
* 07-21-2001 masonb Created
***************************************************************************/
#ifndef _FIXEDPOOL_H_
#define _FIXEDPOOL_H_
#include "CallStack.h"
#include "dnslist.h"
/***************************************************************************
*
* USAGE NOTES:
*
* - This is a generic fixed pool. It allows to reuse items once you have
* allocated them so that you can save the time normally used allocating
* and freeing.
* - This pool may be used with classes, but you should be aware that the
* class' constructor and destructor will not be called. This pool also
* will not work on classes that inherit from a class that has virtual
* functions that are not pure virtuals (ie interfaces are okay).
*
* IMPLEMENTATION NOTES:
*
* - This pool is non-invasive. In other words it does not utilize any of
* the memory space alloted to the item itself to maintain its state.
* - The pool can hold a maximum of sizeof(WORD) = 65535 items due to its
* reliance on SLISTs.
* - An element will be on either the Available or InUse queue. The InUse
* queue is used only in debug for reporting memory leaks.
*
***************************************************************************/
typedef BOOL (*FN_BLOCKALLOC)(void * pvItem, void * pvContext);
typedef VOID (*FN_BLOCKGET)(void * pvItem, void * pvContext);
typedef VOID (*FN_BLOCKRELEASE)(void * pvItem);
typedef VOID (*FN_BLOCKDEALLOC)(void *pvItem);
class CFixedPool
{
public:
struct FIXED_POOL_ITEM
{
DNSLIST_ENTRY slist; // Link to other elements
#ifdef DBG
CFixedPool* pThisPool; // This is used to ensure that items are returned to the correct pool (debug builds only)
CCallStack callstack; // size=12 pointers
#else // !DBG
VOID* pAlignPad; // To stay heap aligned we need an even number of pointers (SLIST is one)
#endif // DBG
};
BOOL Initialize(DWORD dwElementSize, // size of blocks in pool
FN_BLOCKALLOC pfnBlockAlloc, // fn called for each new alloc
FN_BLOCKGET pfnBlockGet, // fn called each time block used
FN_BLOCKRELEASE pfnBlockRelease, // fn called each time block released
FN_BLOCKDEALLOC pfnBlockDeAlloc // fn called before releasing mem
);
VOID DeInitialize();
#ifdef DPNBUILD_PREALLOCATEDMEMORYMODEL
DWORD Preallocate( DWORD dwCount, PVOID pvContext );
#endif // DPNBUILD_PREALLOCATEDMEMORYMODEL
VOID* Get( PVOID pvContext = NULL );
VOID Release(VOID* pvItem);
DWORD GetInUseCount();
private:
FN_BLOCKALLOC m_pfnBlockAlloc;
FN_BLOCKGET m_pfnBlockGet;
FN_BLOCKRELEASE m_pfnBlockRelease;
FN_BLOCKDEALLOC m_pfnBlockDeAlloc;
DWORD m_dwItemSize;
DNSLIST_HEADER m_slAvailableElements;
BOOL m_fInitialized;
#ifdef DBG
void DumpLeaks();
DNSLIST_ENTRY* m_pInUseElements;
#ifndef DPNBUILD_ONLYONETHREAD
DNCRITICAL_SECTION m_csInUse;
#endif // !DPNBUILD_ONLYONETHREAD
LONG m_lAllocated;
#endif // DBG
LONG m_lInUse;
};
#endif // _FIXEDPOOL_H_