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

226 lines
4.7 KiB
C++

// -*- c++ -*-
// perflib.h
//
#ifndef __PERFLIB_H
#define __PERFLIB_H
#define MAX_PERF_NAME 16
#define MAX_OBJECT_NAME 16
#define MAX_INSTANCE_NAME 32
typedef WCHAR OBJECTNAME[MAX_OBJECT_NAME];
typedef WCHAR INSTANCENAME[MAX_INSTANCE_NAME];
#define MAX_PERF_OBJECTS 16
#define MAX_OBJECT_INSTANCES 64
#define MAX_OBJECT_COUNTERS 64
class PerfObjectInstance;
class PerfCounterDefinition;
class PerfObjectDefinition;
struct INSTANCE_DATA
{
BOOL fActive;
PERF_INSTANCE_DEFINITION perfInstDef;
INSTANCENAME wszInstanceName;
};
class PerfLibrary
{
friend class PerfObjectDefinition;
friend class PerfCounterDefinition;
private:
// name of this performance module
WCHAR m_wszPerfName[MAX_PERF_NAME];
// array of PerfObjectDefinition's and a count of how many there are.
PerfObjectDefinition* m_rgpObjDef[MAX_PERF_OBJECTS];
DWORD m_dwObjDef;
// shared memory handle and pointer to base of shared memory
HANDLE m_hMap;
PBYTE m_pbMap;
// pointers to places in the shared memory where we keep stuff
DWORD* m_pdwObjectNames;
OBJECTNAME* m_prgObjectNames;
// base values for title text and help text for the library
DWORD m_dwFirstHelp;
DWORD m_dwFirstCounter;
void AddPerfObjectDefinition( PerfObjectDefinition* pObjDef );
public:
PerfLibrary( LPCWSTR pcwstrPerfName = L"");
~PerfLibrary( void );
void InitName( LPCWSTR pcwstrPerfName )
{
lstrcpynW( m_wszPerfName, pcwstrPerfName, MAX_PERF_NAME );
}
BOOL Init( void );
};
class PerfObjectDefinition
{
friend class PerfLibrary;
friend class PerfCounterDefinition;
friend class PerfObjectInstance;
private:
WCHAR m_wszObjectName[MAX_OBJECT_NAME];
DWORD m_dwObjectNameIndex;
DWORD m_dwMaxInstances;
PerfCounterDefinition* m_rgpCounterDef[MAX_OBJECT_COUNTERS];
DWORD m_dwCounters;
DWORD m_dwDefinitionLength;
DWORD m_dwCounterData;
DWORD m_dwPerInstanceData;
HANDLE m_hMap;
void* m_pv;
PERF_OBJECT_TYPE* m_pPerfObjectType;
PERF_COUNTER_DEFINITION* m_rgPerfCounterDefinition;
char* m_pCounterData;
DWORD m_dwActiveInstances;
BOOL Init( PerfLibrary* pPerfLib );
void AddPerfCounterDefinition( PerfCounterDefinition* pcd );
DWORD GetCounterOffset( DWORD dwId );
void OnInstanceDestroyed( void );
public:
PerfObjectDefinition( PerfLibrary& rPerfLib,
LPCWSTR pwcstrObjectName,
DWORD dwObjectNameIndex,
DWORD dwMaxInstances = PERF_NO_INSTANCES );
PerfObjectDefinition( PerfLibrary& rPerfLib,
DWORD dwObjectNameIndex,
DWORD dwMaxInstances = PERF_NO_INSTANCES );
void InitName( LPCWSTR pwcstrObjectName )
{
lstrcpynW( m_wszObjectName, pwcstrObjectName, MAX_OBJECT_NAME );
}
~PerfObjectDefinition( void );
PerfObjectInstance* CreateObjectInstance( LPCWSTR pwstrInstanceName );
};
class PerfCounterDefinition
{
friend class PerfObjectDefinition;
private:
PerfObjectDefinition* m_pObjDef;
PerfCounterDefinition* m_pCtrRef;
DWORD m_dwCounterNameIndex;
LONG m_lDefaultScale;
DWORD m_dwCounterType;
DWORD m_dwCounterSize;
DWORD m_dwOffset;
void Init( PerfLibrary* pPerfLib,
PERF_COUNTER_DEFINITION* pdef, PDWORD pdwOffset );
public:
PerfCounterDefinition( PerfObjectDefinition& robj,
DWORD dwCounterNameIndex,
DWORD dwCounterType = PERF_COUNTER_COUNTER,
LONG lDefaultScale = 0 );
PerfCounterDefinition( PerfCounterDefinition& pRefCtr,
DWORD dwCounterNameIndex,
DWORD dwCounterType = PERF_COUNTER_COUNTER,
LONG lDefaultScale = 0 );
};
class PerfObjectInstance
{
private:
PerfObjectDefinition* m_pObjDef;
WCHAR m_wszInstanceName[MAX_INSTANCE_NAME];
INSTANCE_DATA* m_pInstanceData;
char* m_pCounterData;
public:
PerfObjectInstance( PerfObjectDefinition* pObjDef,
LPCWSTR pwcstrInstanceName,
char* pCounterData,
INSTANCE_DATA* pInstanceData,
LONG lID );
~PerfObjectInstance();
DWORD* GetDwordCounter( DWORD dwId );
LARGE_INTEGER* GetLargeIntegerCounter( DWORD dwId );
};
class CLongCounter
{
public:
CLongCounter(): m_plCounter(NULL) {}
~CLongCounter() {}
void Init(DWORD *pdwCounter)
{
m_plCounter = (LPLONG)pdwCounter;
Reset();
}
void Increment() { if(m_plCounter) InterlockedIncrement(m_plCounter); }
void Decrement() { if(m_plCounter) InterlockedDecrement(m_plCounter); }
void Reset() { if(m_plCounter) InterlockedExchange(m_plCounter, 0); }
void Set(DWORD dw) { if(m_plCounter) InterlockedExchange(m_plCounter, (LONG)dw); }
void operator++() { Increment(); }
void operator--() { Decrement(); }
void operator =(DWORD dw) { Set(dw); }
private:
LPLONG m_plCounter;
};
#endif