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.
|
|
//#---------------------------------------------------------------
// 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_
|