Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

171 lines
3.9 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
TSS.CPP
Abstract:
This file defines the classes used by the Timer Subsystem.
Classes defined:
RecurrenceInstruction Complex recurrence information.
TimerInstruction Single instruction for the timer
History:
26-Nov-96 raymcc Draft
28-Dec-96 a-richm Alpha PDK Release
12-Apr-97 a-levn Extensive changes
--*/
#ifndef _TSS_H_
#define _TSS_H_
#include <functional>
#include <wbemidl.h>
#include <stdio.h>
#include "sync.h"
#include "CWbemTime.h"
#include "parmdefs.h"
#define INSTTYPE_WBEM 1
#define INSTTYPE_INTERNAL 2
#define INSTTYPE_AGGREGATION 3
#define INSTTYPE_UNLOAD 4
#define INSTTYPE_FREE_LIB 5
class POLARITY CTimerInstruction
{
public:
CTimerInstruction(){}
virtual ~CTimerInstruction()
{
}
virtual void AddRef() = 0;
virtual void Release() = 0;
virtual int GetInstructionType() = 0;
public:
virtual CWbemTime GetNextFiringTime(CWbemTime LastFiringTime,
OUT long* plFiringCount) const = 0;
virtual CWbemTime GetFirstFiringTime() const = 0;
virtual HRESULT Fire(long lNumTimes, CWbemTime NextFiringTime) = 0;
virtual HRESULT MarkForRemoval(){return S_OK;}
};
class POLARITY CInstructionTest
{
public:
virtual BOOL operator()(CTimerInstruction* pToTest) = 0;
};
class POLARITY CIdentityTest : public CInstructionTest
{
protected:
CTimerInstruction* m_pInst;
public:
CIdentityTest(CTimerInstruction* pInst) : m_pInst(pInst)
{
pInst->AddRef();
}
~CIdentityTest() {m_pInst->Release();}
BOOL operator()(CTimerInstruction* pToTest) {return pToTest == m_pInst;}
};
class POLARITY CInstructionQueue
{
public:
CInstructionQueue();
~CInstructionQueue();
HRESULT Enqueue(IN CWbemTime When, IN ADDREF CTimerInstruction* pInst);
HRESULT Remove(IN CInstructionTest* pPred,
OUT RELEASE_ME CTimerInstruction** ppInst = NULL);
HRESULT Change(CTimerInstruction* pInst, CWbemTime When);
HRESULT WaitAndPeek(OUT RELEASE_ME CTimerInstruction*& pInst,
OUT CWbemTime& When);
void BreakWait();
BOOL IsEmpty();
HRESULT Dequeue(OUT RELEASE_ME CTimerInstruction*& pInst,
OUT CWbemTime& When);
long GetNumInstructions();
protected:
CWbemInterval TimeToWait();
void TouchHead();
public:
protected:
struct CQueueEl
{
CWbemTime m_When;
CTimerInstruction* m_pInst;
CQueueEl* m_pNext;
CQueueEl() : m_pInst(NULL), m_pNext(NULL){}
CQueueEl(ADDREF CTimerInstruction* pInst, CWbemTime When)
: m_pInst(pInst), m_pNext(NULL), m_When(When)
{
if(pInst)pInst->AddRef();
}
~CQueueEl()
{
if(m_pInst) m_pInst->Release();
}
};
CQueueEl* m_pQueue;
CCritSec m_csQueue;
HANDLE m_hNewHead;
BOOL m_bBreak;
};
///*****************************************************************************
//
// class CTimerGenerator
//
// Primary Timer Subsystem class. Accepts timer instructions and fires them
// at approriate times.
//
//*****************************************************************************
class POLARITY CTimerGenerator : public CHaltable
{
public:
CTimerGenerator();
~CTimerGenerator();
HRESULT Set(ADDREF CTimerInstruction *pInst,
CWbemTime NextFiring = CWbemTime::GetZero());
HRESULT Remove(CInstructionTest* pPred);
virtual HRESULT Shutdown();
void ScheduleFreeUnusedLibraries();
protected:
virtual void NotifyStartingThread(){}
virtual void NotifyStoppingThread(){}
private:
static DWORD SchedulerThread(LPVOID pArg);
void EnsureRunning();
protected:
CInstructionQueue m_Queue;
HANDLE m_hSchedulerThread;
BOOL m_fExitNow;
CCritSec m_cs;
};
#endif