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.
 
 
 
 
 
 

174 lines
4.8 KiB

/*++
Copyright (C) 1997-2001 Microsoft Corporation
Module Name:
PERFCACH.H
Abstract:
Defines data useful for the NT performance providers.
History:
a-davj 04-Mar-97 Created.
--*/
#define PERMANENT 0xFFFFFFFF
// If an object has not be retrieved in this many MS, the stop
// automatically getting it
#define MAX_UNUSED_KEEP 30000
// Define how big the buffers will start as. This size should be a bit
// bigger than the "standard" counters and thus reallocations shouldnt
// be necessary
#define INITIAL_ALLOCATION 25000
// maximum age in ms of the "newest" data in the cache
#define MAX_NEW_AGE 2000
// maximum age in ms of the "oldest" data in the cache
#define MAX_OLD_AGE 10000
// minimum time difference between old and new sample
#define MIN_TIME_DIFF 1000
typedef struct _LINESTRUCT
{
LONGLONG lnNewTime;
LONGLONG lnOldTime;
LONGLONG lnOldTime100Ns ;
LONGLONG lnNewTime100Ns ;
LONGLONG lnaCounterValue[2];
LONGLONG lnaOldCounterValue[2];
DWORD lnCounterType;
LONGLONG lnPerfFreq ;
LONGLONG ObjPerfFreq ;
LONGLONG ObjCounterTimeNew;
LONGLONG ObjCounterTimeOld;
}LINESTRUCT ;
typedef LINESTRUCT *PLINESTRUCT ;
FLOAT CounterEntry (PLINESTRUCT pLine);
class Entry : public CObject {
public:
int iObject;
DWORD dwLastUsed;
};
//***************************************************************************
//
// CLASS NAME:
//
// CIndicyList
//
// DESCRIPTION:
//
// Implementation of the CIndicyList class. This class keeps a list of the
// object types that are to be retrieved. Each object type also has a time
// of last use so that object types that are no longer used will not be
// retrieved forever. Some entries are part of the standard globals and
// are marked as permanent so that they will always be read.
//
//***************************************************************************
class CIndicyList : public CObject {
public:
BOOL SetUse(int iObj);
BOOL bItemInList(int iObj);
BOOL bAdd(int iObj, DWORD dwTime);
void PruneOld(void);
LPCTSTR pGetAll(void);
// BOOL bItemInList(int iObj);
~CIndicyList(){FreeAll();};
CIndicyList & operator = ( CIndicyList & from);
void FreeAll(void);
private:
TString sAll;
CFlexArray Entries;
};
//***************************************************************************
//
// CLASS NAME:
//
// PerfBuff
//
// DESCRIPTION:
//
// Holds a chunk of data read from the registry's perf monitor data.
//
//***************************************************************************
class PerfBuff : public CObject {
public:
friend class PerfCache;
DWORD Read(HKEY hKey, int iObj, BOOL bInitial);
LPSTR Get(int iObj);
void Free();
~PerfBuff(){Free();};
PerfBuff();
BOOL bOK(HKEY hKey, DWORD dwMaxAge, int iObj);
PerfBuff & operator = ( PerfBuff & from);
BOOL bEmpty(void){return !dwSize;};
// __int64 Time(void){return dwBuffLastRead;};
// __int64 Time2(void){return PerfTime;};
private:
DWORD dwSize;
LPSTR pData;
CIndicyList List;
HKEY hKeyLastRead;
DWORD dwBuffLastRead; // GetCurrentTime of last read
LONGLONG PerfTime; // Time in last block
LONGLONG PerfTime100nSec; // Time in last block
LONGLONG PerfFreq;
};
//***************************************************************************
//
// CLASS NAME:
//
// PerfCache
//
// DESCRIPTION:
//
// Implementation of the PerfCache class. This is the object which is
// directly used by the perf provider class. Each object keeps track of
// several PerfBuff object. There is a newest which is what was just read,
// an oldest which has previously read data and an intermediate buffer which
// has data that isnt quite old enough to be moved into the old buffer. Note
// that time average data requires having two samples which are separated by
// a MIN_TIME_DIFF time difference.
//
//***************************************************************************
class PerfCache : public CObject {
public:
void FreeOldBuffers(void);
DWORD dwGetNew(LPCTSTR pName, int iObj, LPSTR * pData,PLINESTRUCT pls);
DWORD dwGetPair(LPCTSTR pName, int iObj, LPSTR * pOldData,
LPSTR * pNewData,PLINESTRUCT pls);
PerfCache();
~PerfCache();
private:
PerfBuff Old,New;
HKEY hHandle;
TString sMachine;
DWORD dwGetHandle(LPCTSTR pName);
};