/* - perfapp.hpp - * Purpose: * Declare Perfmon Classes * * Notes: * User must define two zero-based enums representing the PerfMon counters: * GLOBAL_CNTR Global Perfmon Counters * INST_CNTR Instance Perfmon Counters * They must be defined before including this header. * * Copyright: * * */ #if !defined(_PERFAPP_HPP_) #define _PERFAPP_HPP_ #pragma once #include // Forward Reference for Lib enum GLOBAL_CNTR; enum INST_CNTR; /* - class GLOBCNTR - * Purpose: * Object that encapsulates the global perfmon counter for DMI. * */ class GLOBCNTR { private: // // Data Members HANDLE m_hsm; // Shared Memory DWORD m_cCounters; // # of counters DWORD * m_rgdwPerfData; // Counters BOOL m_fInit; // Init test flag // For Shared Memory SECURITY_ATTRIBUTES m_sa; public: // Constructor // // Declared private to ensure that arbitrary instances // of this class cannot be created. The Singleton // template (declared as a friend above) controls // the sole instance of this class. // GLOBCNTR() : m_hsm(NULL), m_cCounters(0), m_rgdwPerfData(NULL), m_fInit(FALSE) { m_sa.lpSecurityDescriptor=NULL; }; ~GLOBCNTR() { if(m_sa.lpSecurityDescriptor) LocalFree(m_sa.lpSecurityDescriptor); }; // Parameters: // cCounters Total number of global counters. ("special" last element in GLOB_CNTR) // wszGlobalSMName Name of the shared memory block (shared with DLL) // wszSvcName Service Name (for event logging) HRESULT HrInit(GLOBAL_CNTR cCounters, LPWSTR szGlobalSMName, LPWSTR szSvcName); void Shutdown(void); void IncPerfCntr(GLOBAL_CNTR cntr); void DecPerfCntr(GLOBAL_CNTR cntr); void SetPerfCntr(GLOBAL_CNTR cntr, DWORD dw); void AddPerfCntr(GLOBAL_CNTR cntr, DWORD dw); void SubPerfCntr(GLOBAL_CNTR cntr, DWORD dw); LONG LGetPerfCntr(GLOBAL_CNTR cntr); private: // Not Implemented to prevent compiler from auto-generating // GLOBCNTR(const GLOBCNTR& x); GLOBCNTR& operator=(const GLOBCNTR& x); }; /* - class INSTCNTR - * Purpose: * Class used to manipulate the per instance PerfMon counters for DMI. * * Notes: * This manages two shared memory blocks: The first manages the per instance * info, and whether or not that instance record is in use. The second is an array * of counter blocks; each counter block is an array of however many Instance Counters * the user says there are (passed in to HrInit()). These blocks correspond to * m_hsmAdm and m_hsmCntr, respectively. * */ class INSTCNTR { // Constructor // // Declared private to ensure that arbitrary instances // of this class cannot be created. The Singleton // template (declared as a friend above) controls // the sole instance of this class. INSTCNTR() : m_hsmAdm(NULL), m_hsmCntr(NULL), m_hmtx(NULL), m_rgInstRec(NULL), m_rgdwCntr(NULL), m_cCounters(0), m_fInit(FALSE) { m_sa.lpSecurityDescriptor=NULL; }; ~INSTCNTR(); // Private Data Members HANDLE m_hsmAdm; // Admin Shared Memory HANDLE m_hsmCntr; // Counters Shared Memory HANDLE m_hmtx; // Mutex controlling Shared Memory INSTCNTR_DATA * m_picd; // Perf Counter Data INSTREC * m_rgInstRec; // Array of Instance Records DWORD * m_rgdwCntr; // Array of Instance Counter Blocks DWORD m_cCounters; // # Counters BOOL m_fInit; // Init test flag // For Shared Memory SECURITY_ATTRIBUTES m_sa; public: // NOTE: Use the Singleton mechanisms for Creating, Destroying and // obtaining an instance of this object // Parameters: // cCounters Total number of global counters. ("special" last element in INST_CNTR) // wszInstSMName Name of the shared memory block (shared with DLL) // wszInstMutexName Name of the Mutex controlling the instance memory blocks // wszSvcName Service Name (for event logging) HRESULT HrInit(INST_CNTR cCounters, LPWSTR szInstSMName, LPWSTR szInstMutexName, LPWSTR szSvcName); void Shutdown(BOOL fWipeOut=TRUE); HRESULT HrCreateOrGetInstance(IN LPCWSTR wszInstName, OUT INSTCNTR_ID *picid); HRESULT HrDestroyInstance(INSTCNTR_ID icid); void IncPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr); void DecPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr); void SetPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw); void AddPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw); void SubPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw); LONG LGetPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr); private: // Not Implemented to prevent compiler from auto-generating // INSTCNTR(const INSTCNTR& x); INSTCNTR& operator=(const INSTCNTR& x); }; //#endif // INSTANCE_DATA_DEFINED //----------------------------------------------------------------------------- // GLOBCNTR inline functions //----------------------------------------------------------------------------- inline void GLOBCNTR::IncPerfCntr(GLOBAL_CNTR cntr) { if (m_fInit) InterlockedIncrement((LONG *)&m_rgdwPerfData[cntr]); } inline void GLOBCNTR::DecPerfCntr(GLOBAL_CNTR cntr) { if (m_fInit) InterlockedDecrement((LONG *)&m_rgdwPerfData[cntr]); } inline void GLOBCNTR::SetPerfCntr(GLOBAL_CNTR cntr, DWORD dw) { if (m_fInit) InterlockedExchange((LONG *)&m_rgdwPerfData[cntr], (LONG)dw); } inline void GLOBCNTR::AddPerfCntr(GLOBAL_CNTR cntr, DWORD dw) { if (m_fInit) InterlockedExchangeAdd((LONG *)&m_rgdwPerfData[cntr], (LONG)dw); } inline void GLOBCNTR::SubPerfCntr(GLOBAL_CNTR cntr, DWORD dw) { if (m_fInit) InterlockedExchangeAdd((LONG *)&m_rgdwPerfData[cntr], -((LONG)dw)); } inline LONG GLOBCNTR::LGetPerfCntr(GLOBAL_CNTR cntr) { return m_fInit ? m_rgdwPerfData[cntr] : 0; } // #ifdef INSTANCE_DATA_DEFINED //----------------------------------------------------------------------------- // INSTCNTR inline functions //----------------------------------------------------------------------------- inline void INSTCNTR::IncPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr) { if (m_fInit) { if ((icid != INVALID_INST_ID) && m_rgInstRec[icid].fInUse) InterlockedIncrement((LONG *)&m_rgdwCntr[((icid * m_cCounters)+ cntr)]); } } inline void INSTCNTR::DecPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr) { if (m_fInit) { if ((icid != INVALID_INST_ID) && m_rgInstRec[icid].fInUse) InterlockedDecrement((LONG *)&m_rgdwCntr[((icid * m_cCounters) + cntr)]); } } inline void INSTCNTR::SetPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw) { if (m_fInit) { if ((icid != INVALID_INST_ID) && m_rgInstRec[icid].fInUse) InterlockedExchange((LONG *)&m_rgdwCntr[((icid * m_cCounters) + cntr)], (LONG)dw); } } inline void INSTCNTR::AddPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw) { if (m_fInit) { if ((icid != INVALID_INST_ID) && m_rgInstRec[icid].fInUse) InterlockedExchangeAdd((LONG *)&m_rgdwCntr[((icid * m_cCounters) + cntr)], (LONG)dw); } } inline void INSTCNTR::SubPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr, DWORD dw) { if (m_fInit) { if ((icid != INVALID_INST_ID) && m_rgInstRec[icid].fInUse) InterlockedExchangeAdd((LONG *)&m_rgdwCntr[((icid * m_cCounters) + cntr)], -((LONG)dw)); } } inline LONG INSTCNTR::LGetPerfCntr(INSTCNTR_ID icid, INST_CNTR cntr) { return m_fInit ? m_rgdwCntr[((icid * m_cCounters) + cntr)] : 0; } // #endif // INSTANCE_DATA_DEFINED #endif //!defined(_PERFAPP_HPP_)