/*++ Copyright (C) 1996-2001 Microsoft Corporation Module Name: SLEEPER.H Abstract: MinMax controls. History: --*/ #ifndef ___WBEM_SLEEPER__H_ #define ___WBEM_SLEEPER__H_ #include "sync.h" #include "wstring.h" //****************************************************************************** // // class CLimitControl // // Limits the growth of a certain quantity by delaying requests to add to it. // This is an abstract base class for the classes that actually implement a // a particular enforcement strategy. // // Clients of this object call Add to request to increase the controlled // quantity (which will often sleep), and Remove to inform it that the quantity // is being reduced (which may or may not affect the sleeping clients) // //****************************************************************************** class POLARITY CLimitControl { protected: DWORD m_dwMembers; public: CLimitControl(); virtual ~CLimitControl(){} virtual HRESULT AddMember(); virtual HRESULT RemoveMember(); virtual HRESULT Add(DWORD dwHowMuch, DWORD dwMemberTotal, DWORD* pdwSleep = NULL) = 0; virtual HRESULT Remove(DWORD dwHowMuch) = 0; }; //****************************************************************************** // // class CMinMaxLimitControl // // This derivative of CLimitControl controls the growth of a quantity by // slowing down (sleeping) progressively longer periods of time after the // quantity exceeds the lower threshold --- m_dwMin. The growth of the // sleep interval is linear, and is calculates to reach m_dwSleepAnMax // milliseconds by the time the quantity reaches m_dwMax. At that point, an // error message is logged, but the sleep interval stays at m_dwSleepAtMax. // // m_nLog is the index of the log file (e.g. LOG_ESS), m_wsName is the name // of the controlled quantity to use in the log message // //****************************************************************************** class POLARITY CMinMaxLimitControl : public CLimitControl { protected: DWORD m_dwMin; DWORD m_dwMax; DWORD m_dwSleepAtMax; int m_nLog; WString m_wsName; DWORD m_dwCurrentTotal; BOOL m_bMessageLogged; CCritSec m_cs; public: CMinMaxLimitControl(int nLog, LPCWSTR wszName); void SetMin(DWORD dwMin) {m_dwMin = dwMin;} void SetMax(DWORD dwMax) {m_dwMax = dwMax;} void SetSleepAtMax(DWORD dwSleepAtMax) {m_dwSleepAtMax = dwSleepAtMax;} virtual HRESULT Add(DWORD dwHowMuch, DWORD dwMemberTotal, DWORD* pdwSleep = NULL); virtual HRESULT Remove(DWORD dwHowMuch); protected: HRESULT ComputePenalty(DWORD dwNewTotal, DWORD dwMemberTotal, DWORD* pdwSleep, BOOL* pbLog); }; //****************************************************************************** // // class CRegistryMinMaxLimitControl // // This derivative of CMinMaxLimitControl gets its limiting information from // the specified place in the registry // // m_hHive holds the hive, m_wsKey the path to the key (e.g. "SOFTWARE\\MSFT"), // m_wsMinValueName, m_wsMaxValueName, and m_wsSleepAtMaxValueName hold the // names of the registry values holding the values of these parameters, as // described in CMinMaxLimitControl // //****************************************************************************** class POLARITY CRegistryMinMaxLimitControl : public CMinMaxLimitControl { protected: WString m_wsKey; WString m_wsMinValueName; WString m_wsMaxValueName; WString m_wsSleepAtMaxValueName; public: CRegistryMinMaxLimitControl(int nLog, LPCWSTR wszName, LPCWSTR wszKey, LPCWSTR wszMinValueName, LPCWSTR wszMaxValueName, LPCWSTR wszSleepAtMaxValueName) : CMinMaxLimitControl(nLog, wszName), m_wsKey(wszKey), m_wsMinValueName(wszMinValueName), m_wsMaxValueName(wszMaxValueName), m_wsSleepAtMaxValueName(wszSleepAtMaxValueName) {} HRESULT Reread(); }; #endif