Leaked source code of windows server 2003
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.
 
 
 
 
 
 

202 lines
4.2 KiB

#ifndef __sipcli_timer_h__
#define __sipcli_timer_h__
#define TIMER_WINDOW_CLASS_NAME \
_T("SipTimerWindowClassName-84b7f915-2389-4204-9eb5-16f4c522816f")
class TIMER_MGR;
struct TIMER_QUEUE_ENTRY;
class __declspec(novtable) TIMER
{
public:
inline TIMER(
IN TIMER_MGR *pTimerMgr
// IN HWND TimerWindow
);
inline ~TIMER();
HRESULT StartTimer(
IN UINT TimeoutValue
);
HRESULT KillTimer();
void OnTimerExpireCommon();
// Implemented by classes that inherit TIMER
virtual void OnTimerExpire() = 0;
inline BOOL IsTimerActive();
inline TIMER_QUEUE_ENTRY *GetTimerQueueEntry();
private:
//UINT_PTR TimerId;
//HWND m_TimerWindow;
TIMER_MGR *m_pTimerMgr;
TIMER_QUEUE_ENTRY *m_pTimerQEntry;
// XXX Could probably get rid of the timeout value
UINT m_TimeoutValue;
};
inline
TIMER::TIMER(
IN TIMER_MGR *pTimerMgr
// IN HWND TimerWindow
)
{
// m_TimerWindow = TimerWindow;
m_pTimerMgr = pTimerMgr;
m_pTimerQEntry = NULL;
m_TimeoutValue = 0;
}
inline
TIMER::~TIMER()
{
// ASSERT(!IsTimerActive());
if (IsTimerActive())
{
KillTimer();
}
}
inline BOOL
TIMER::IsTimerActive()
{
return !(m_TimeoutValue == 0);
}
inline TIMER_QUEUE_ENTRY *
TIMER::GetTimerQueueEntry()
{
return m_pTimerQEntry;
}
enum TIMERQ_STATE
{
TIMERQ_STATE_INIT = 0,
TIMERQ_STATE_STARTED,
// State when the timer expired and we have posted
// a message to the window for processing the timer
// callback.
TIMERQ_STATE_EXPIRED,
// State when the timer is killed and we have posted
// a message to the window for processing the timer
// callback.
TIMERQ_STATE_KILLED
};
// StartTimer() adds this entry to the queue and KillTimer() removes
// this entry from the queue.
// Note that we can not reuse the TIMER structure for the TIMER_QUEUE_ENTRY
// structure as sometimes the TIMER_QUEUE_ENTRY structure will have to
// live beyond the lifetime of the TIMER structure.
struct TIMER_QUEUE_ENTRY
{
TIMER_QUEUE_ENTRY(
IN TIMER *pTimer,
IN ULONG TimeoutValue
);
LIST_ENTRY m_ListEntry;
ULONG m_ExpireTickCount;
TIMER *m_pTimer;
// Used to deal with the scenario where a timer is killed
// when the windows message for calling the timer callback
// for the timer is still in the message queue.
//BOOL m_IsTimerKilled;
TIMERQ_STATE m_TimerQState;
};
class TIMER_MGR
{
public:
TIMER_MGR();
~TIMER_MGR();
HRESULT Start();
HRESULT Stop();
HRESULT StartTimer(
IN TIMER *pTimer,
IN ULONG TimeoutValue,
OUT TIMER_QUEUE_ENTRY **ppTimerQEntry
);
HRESULT KillTimer(
IN TIMER *pTimer
);
VOID OnMainTimerExpire();
inline VOID DecrementNumExpiredListEntries();
inline ULONG GetNumExpiredListEntries();
private:
// Queue of timers (List of TIMER_QUEUE_ENTRY structures)
// Sorted by m_ExpireTickCount
LIST_ENTRY m_TimerQueue;
ULONG m_NumTimerQueueEntries;
LIST_ENTRY m_ExpiredList;
ULONG m_NumExpiredListEntries;
HWND m_TimerWindow;
BOOL m_IsMainTimerActive;
ULONG m_MainTimerTickCount;
BOOL m_isTimerStopped;
HRESULT ProcessTimerExpire(
IN TIMER_QUEUE_ENTRY *pTimerQEntry
);
VOID AdjustMainTimer();
TIMER_QUEUE_ENTRY *FindTimerQueueEntryInList(
TIMER *pTimer,
LIST_ENTRY *pListHead
);
BOOL IsTimerTickCountLessThanOrEqualTo(
IN ULONG TickCount1,
IN ULONG TickCount2
);
HRESULT CreateTimerWindow();
VOID DebugPrintTimerQueue();
};
inline ULONG
TIMER_MGR::GetNumExpiredListEntries()
{
return m_NumExpiredListEntries;
}
inline VOID
TIMER_MGR::DecrementNumExpiredListEntries()
{
m_NumExpiredListEntries--;
}
#endif // __sipcli_timer_h__