windows-nt/Source/XPSP1/NT/inetsrv/query/cindex/lowres.hxx
2020-09-26 16:20:57 +08:00

188 lines
3.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1998-2000.
//
// File: LowRes.hxx
//
// Contents: Default low-resource detection
//
// Classes: CLowRes
// CUserActivityMonitor
//
// History: 21-Jul-98 KyleP Created
//
//----------------------------------------------------------------------------
#pragma once
class CCiFrameworkParams;
//***
//
// Activity monitor that stores samples in a circular buffer, discarding
// uninteresting events
//
//***
//+---------------------------------------------------------------------------
//
// Class: CUserActivityMonitor
//
// Purpose: Monitors user keyboard and mouse activity
//
// History: 30 Jul 1998 AlanW Created
//
//----------------------------------------------------------------------------
const unsigned cUserActivitySamples = 100;
class CUserActivityMonitor
{
public:
CUserActivityMonitor() :
_dwLastInputTime(0),
_dwLastSampleTime(0),
_iHead(0),
#if CIDBG
_iSnap(0),
_tid (0),
#endif // CIDBG
_iTail(0)
{
}
void SampleUserActivity();
ULONG GetUserActivity( ULONG dwTicks );
DWORD GetLastSampleTime( )
{
return Ticks(_dwLastSampleTime);
}
private:
// Get the tick count part of a sample
DWORD Ticks( DWORD dw )
{
return dw & ~1;
}
void SetInputFlag( DWORD & dw )
{
dw |= 1;
}
void SetSampleFlag( DWORD & dw )
{
dw &= ~1;
}
BOOL IsInput( DWORD dw )
{
return (dw & 1) != 0;
}
BOOL IsSample( DWORD dw )
{
return (dw & 1) == 0;
}
unsigned Next( unsigned i )
{
i++;
return (i == cUserActivitySamples) ? 0 : i;
}
unsigned Prev( unsigned i )
{
return i==0 ? cUserActivitySamples-1 : i-1;
}
void Add( DWORD dw )
{
_iTail = Next(_iTail);
if (_iTail == _iHead)
_iHead = Next(_iHead);
_adwSamples[_iTail] = dw;
}
BOOL IsBufferEmpty()
{
return _iHead == _iTail;
}
#if CIDBG == 1
void Analyze( ULONG infolevel );
#endif // CIDBG == 1
DWORD _dwLastSampleTime; // last sample time
DWORD _dwLastInputTime; // last user input time
unsigned _iHead; // head of circular buffer
unsigned _iTail; // tail of circular buffer
#if CIDBG == 1
unsigned _iSnap; // start of buffer snapshot
DWORD _tid; // sampling thread ID
#endif // CIDBG == 1
DWORD _adwSamples[cUserActivitySamples];
};
//+---------------------------------------------------------------------------
//
// Class: CLowRes
//
// Purpose: Monitors system-wide resource usage
//
// Interface: ICiResourceMonitor
//
// History: 21-Jul-1998 KyleP Created
//
//----------------------------------------------------------------------------
class CLowRes : public ICiCResourceMonitor
{
public:
CLowRes( CCiFrameworkParams & params );
//
// IUnknown methods
//
SCODE STDMETHODCALLTYPE QueryInterface( REFIID riid, void **ppvObject );
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
//
// ICiCResourceMonitor methods
//
SCODE STDMETHODCALLTYPE IsMemoryLow();
SCODE STDMETHODCALLTYPE IsBatteryLow();
SCODE STDMETHODCALLTYPE IsIoHigh( BOOL * pfAbort );
SCODE STDMETHODCALLTYPE IsUserActive( BOOL fCheckLongTermActivity );
SCODE STDMETHODCALLTYPE SampleUserActivity();
SCODE STDMETHODCALLTYPE IsOnBatteryPower();
private:
long _cRefs;
CCiFrameworkParams & _params;
ULONG _ulPagesPerMeg; // System pages per Meg (varies with system page size)
ULONG _ulPageSize; // System page size
CUserActivityMonitor _UserMon; // User idle detection
};