windows-nt/Source/XPSP1/NT/inetsrv/iis/staxinc/export/cpool.h
2020-09-26 16:20:57 +08:00

168 lines
3.4 KiB
C++

//#---------------------------------------------------------------
// File: CPool.h
//
// Synopsis: Header for the CPool class
//
// Copyright (C) 1995 Microsoft Corporation
// All rights reserved.
//
// Authors: HowardCu
//----------------------------------------------------------------
#ifndef _CPOOL_H_
#define _CPOOL_H_
#include "dbgtrace.h"
#define POOL_SIGNATURE (DWORD)'looP'
#define UPSTREAM_SIGNATURE (DWORD)'tspU'
#define DOWNSTREAM_SIGNATURE (DWORD)'tsnD'
#define AUTHENTICATION_SIGNATURE (DWORD)'htuA'
#define USER_SIGNATURE (DWORD)'resU'
#define PROXY_SIGNATURE (DWORD)'xorP'
#define DEFAULT_ALLOC_INCREMENT 0xFFFFFFFF
//
// maximum number of VirtualAlloc chunks to allow
//
#define MAX_CPOOL_FRAGMENTS 16
class CPool
{
//
// struct def'n for linking free instances
// see page 473 of Stroustrup
//
struct Link { Link* pNext; };
public:
CPool( DWORD dwSignature=1 );
~CPool( void );
void *operator new( size_t cSize )
{ return HeapAlloc( GetProcessHeap(), 0, cSize ); }
void operator delete (void *pInstance)
{ HeapFree( GetProcessHeap(), 0, pInstance ); }
#ifdef DEBUG
void IsValid( void );
#else
inline void IsValid( void ) { return; }
#endif
//
// to be called after the constructor to VirtualAlloc the necessary
// memory address
//
BOOL ReserveMemory( DWORD MaxInstances,
DWORD InstanceSize,
DWORD IncrementSize = DEFAULT_ALLOC_INCREMENT );
BOOL ReleaseMemory( void );
void* Alloc( void );
void Free( void* pInstance );
DWORD GetContentionCount( void );
DWORD GetEntryCount( void );
DWORD GetTotalAllocCount()
{ return m_cTotalAllocs; }
DWORD GetTotalFreeCount()
{ return m_cTotalFrees; }
DWORD GetTotalExtraAllocCount()
{ return m_cTotalExtraAllocs; }
DWORD GetCommitCount()
{ return m_cNumberCommitted; }
DWORD GetAllocCount()
{ return m_cNumberInUse; }
DWORD GetInstanceSize(void);
private:
//
// internal function to alloc more mem from the OS
//
void GrowPool( void );
//
// Structure signature for a pool object
//
const DWORD m_dwSignature;
//
// total number of descriptors ( maximum )
//
DWORD m_cMaxInstances;
//
// size of the descriptor
//
DWORD m_cInstanceSize;
//
// virtual array number of committed instances
//
DWORD m_cNumberCommitted;
//
// number of In_use instances ( debug/admin only )
//
DWORD m_cNumberInUse;
//
// number of Free instances ( debug/admin only )
//
DWORD m_cNumberAvail;
//
// the handle of the pool critical section
//
CRITICAL_SECTION m_PoolCriticalSection;
//
// the pointer to the first descriptor on the free list
//
Link *m_pFreeList;
//
// the pointer to a free descriptor not on the free list
//
Link *m_pExtraFreeLink;
//
// number to increment the pool when expanding
//
DWORD m_cIncrementInstances;
//
// Debug counters for perf testing ( debug/admin only )
//
DWORD m_cTotalAllocs;
DWORD m_cTotalFrees;
DWORD m_cTotalExtraAllocs;
//
// Debug variables to help catch heap bugs
//
Link *m_pLastAlloc;
Link *m_pLastExtraAlloc;
//
// size of each fragment in instances
//
DWORD m_cFragmentInstances;
//
// maximum number of fragments
//
DWORD m_cFragments;
//
// maximum number of fragments
//
LPVOID m_pFragments[ MAX_CPOOL_FRAGMENTS ];
};
#endif //!_CPOOL_H_