188 lines
3.9 KiB
C++
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
|
|
};
|