// -*- 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