windows-nt/Source/XPSP1/NT/net/rras/ip/nath323/timer.cpp
2020-09-26 16:20:57 +08:00

142 lines
3 KiB
C++

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
timer.cpp
Abstract:
Contains:
Routines for timer operations
Environment:
User Mode - Win32
History:
1. 14-Feb-2000 -- File creation (based on Ilya Kleyman (ilyak)
previous work by AjayCh)
--*/
#include "stdafx.h"
///////////////////////////////////////////////////////////////////////////////
// //
// Global Variables //
// //
///////////////////////////////////////////////////////////////////////////////
// TIMER_PROCESSOR ------------------------------------------------------------------
/*
* This function is passed as the callback in the
* CreateTimerQueueTimer() function
*/
// static
void WINAPI TimeoutCallback (
IN PVOID Context,
IN BOOLEAN TimerFired)
{
TIMER_PROCESSOR *pTimerProcessor = (TIMER_PROCESSOR *) Context;
pTimerProcessor->TimerCallback();
// At this point the timer would have been canceled because
// this is a one shot timer (no period)
}
/*++
Routine Description:
Create a timer.
Arguments:
Return Values:
if Success the caller should increase the ref count.
--*/
DWORD TIMER_PROCESSOR::TimprocCreateTimer (
IN DWORD TimeoutValue)
{
HRESULT Result;
if (m_TimerHandle) {
DebugF (_T("H323: timer is already pending, cannot create new timer.\n"));
return E_FAIL;
}
IncrementLifetimeCounter ();
if (CreateTimerQueueTimer(&m_TimerHandle,
NATH323_TIMER_QUEUE,
TimeoutCallback,
this,
TimeoutValue,
0, // One shot timer
WT_EXECUTEINIOTHREAD)) {
assert (m_TimerHandle);
Result = S_OK;
}
else {
Result = GetLastResult();
DecrementLifetimeCounter ();
}
return Result;
}
/*++
Routine Description:
Cancel the timer if there is one. Otherwise simply return.
Arguments:
Return Values:
--*/
// If Canceling the timer fails this means that the
// timer callback could be pending. In this scenario,
// the timer callback could execute later and so we
// should not release the refcount on the TIMER_CALLBACK
// The refcount will be released in the TimerCallback().
// Release the ref count if callback is NOT pending.
DWORD TIMER_PROCESSOR::TimprocCancelTimer (void) {
HRESULT HResult = S_OK;
if (m_TimerHandle != NULL) {
if (DeleteTimerQueueTimer(NATH323_TIMER_QUEUE, m_TimerHandle, NULL)) {
DecrementLifetimeCounter ();
}
else {
HResult = GetLastError ();
}
m_TimerHandle = NULL;
}
return HResult;
}