134 lines
4 KiB
C
134 lines
4 KiB
C
|
/*++
|
||
|
|
||
|
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
|