Source code of Windows XP (NT5)
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.
|
|
// TODO: Move this to utility library.
#pragma once
#include <windows.h>
#include <winperf.h>
#include <malloc.h>
// For now, use the symbol offset from the perfsym.h file to identify a particular counter.
typedef __int32 PERFC;
class CAccumulator { public: CAccumulator() { m_pb = NULL; m_cbAlloc = m_cbCur = 0; } ~CAccumulator() { free(m_pb); }
bool Accumulate(void * pb, DWORD cb); BYTE * Buffer() { return m_pb; } DWORD Size() { return m_cbCur; } BYTE * Detach() { BYTE * pbT = m_pb; m_pb = NULL; m_cbAlloc = m_cbCur = 0; return pbT; }
private: DWORD m_cbAlloc; DWORD m_cbCur; BYTE * m_pb; };
struct PerfObject { DWORD ObjectNameTitleIndex; DWORD DetailLevel; // Do we care?
DWORD DefaultCounter; LARGE_INTEGER PerfTime; LARGE_INTEGER PerfFreq; };
struct PerfCounter { DWORD CounterNameTitleIndex; // Relative to start of this app's block; Offset into global database will be added later
DWORD DefaultScale; DWORD DetailLevel; // Do we care?
DWORD CounterType; };
struct PerfInstanceHeader { bool fInUse; // TRUE if active instance
DWORD dwPID; // Process ID of owning process
};
class CPerfCounterManager { friend class CPerfCounterObject;
public: CPerfCounterManager() { m_hSharedMem = NULL; m_pbSharedMem = NULL; m_ppot = NULL; } ~CPerfCounterManager(); DWORD Init(char * mapname, __int32 cCountersPerObject, __int32 cObjectsMax);
// These functions used only by the performance DLL.
DWORD Open(LPWSTR lpDeviceNames, char * appname, PerfObject * ppo, PerfCounter * apc); DWORD Collect(LPWSTR lpwszValue, LPVOID *lppData, LPDWORD lpcbBytes, LPDWORD lpcObjectTypes); DWORD Close();
// These functions used only by the application, indirectly via CPerfCounterObject.
__int32 AllocInstance(); void FreeInstance(__int32 iInstance);
private: HANDLE m_hSharedMem; unsigned __int8 * m_pbSharedMem; unsigned __int32 m_cCountersPerObject; unsigned __int32 m_cObjectsMax; unsigned __int32 m_cbPerCounterBlock; unsigned __int32 m_cbPerInstance;
CAccumulator m_accumHeader; PERF_OBJECT_TYPE * m_ppot; };
// An instance of a particular performance object.
class CPerfCounterObject { public: CPerfCounterObject() { m_ppcm = NULL; } ~CPerfCounterObject(); bool Init(CPerfCounterManager *);
void IncrementCounter(PERFC perfc); void SetCounter(PERFC perfc, __int32 value);
private: CPerfCounterManager * m_ppcm; int m_iInstance; };
|