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.
 
 
 
 
 
 

187 lines
5.0 KiB

//-----------------------------------------------------------------------------
//
//
// File: aqdbgcnt.cpp
//
// Description: Implementation of CDeubgCountdown object
//
// Author: Mike Swafford (MikeSwa)
//
// History:
// 10/28/98 - MikeSwa Created
//
// Copyright (C) 1998 Microsoft Corporation
//
//-----------------------------------------------------------------------------
#include "aqprecmp.h"
#include "aqdbgcnt.h"
//---[ CDebugCountdown::ThreadStartRoutine ]-----------------------------------
//
//
// Description:
// This is the main worker routine for the class it keeps on calling
// WaitForSingleObject... and will assert if it times out.
// Parameters:
// pvThis The "this" ptr for this object
// Returns:
// Always 0
// History:
// 10/27/98 - MikeSwa Created
//
//-----------------------------------------------------------------------------
DWORD CDebugCountdown::ThreadStartRoutine(PVOID pvThis)
{
_ASSERT(pvThis);
DWORD dwWaitResult = 0;
DWORD dwTick1 = 0;
DWORD dwTick2 = 0;
CDebugCountdown *pdbgcntThis = (CDebugCountdown *) pvThis;
_ASSERT(DEBUG_COUNTDOWN_SIG == pdbgcntThis->m_dwSignature);
while (DEBUG_COUNTDOWN_ENDED != pdbgcntThis->m_dwFlags)
{
_ASSERT(pdbgcntThis->m_hEvent);
dwTick1 = GetTickCount();
dwWaitResult = WaitForSingleObject(pdbgcntThis->m_hEvent,
pdbgcntThis->m_dwMilliseconds);
dwTick2 = GetTickCount();
if (DEBUG_COUNTDOWN_SUSPENDED != pdbgcntThis->m_dwFlags)
{
//This assert is the whole reason for the existance of this object
_ASSERT((WAIT_TIMEOUT != dwWaitResult) && "Failure to call stop hints... check threads");
}
}
return 0;
}
CDebugCountdown::CDebugCountdown()
{
m_dwSignature = DEBUG_COUNTDOWN_SIG;
m_hEvent = NULL;
m_dwMilliseconds = DEBUG_COUNTDOWN_DEFAULT_WAIT;
m_hThread = NULL;
m_dwFlags = 0;
}
CDebugCountdown::~CDebugCountdown()
{
if (m_hEvent)
_VERIFY(CloseHandle(m_hEvent));
if (m_hThread)
_VERIFY(CloseHandle(m_hThread));
}
//The following group of functions are defined as inline NULL-ops in retail
//builds. Below are there debug implementations
#ifdef DEBUG
//---[ CDebugCountdown::StartCountdown ]---------------------------------------
//
//
// Description:
// Starts the countdown timer... will create an event and a thread to
// wait on that event.
// Parameters:
// dwMilliseconds Milliseconds to wait before ASSERTING
// Returns:
// -
// History:
// 10/28/98 - MikeSwa Created
//
//-----------------------------------------------------------------------------
void CDebugCountdown::StartCountdown(DWORD dwMilliseconds)
{
DWORD dwThreadId = 0;
m_dwMilliseconds = dwMilliseconds;
if (!m_hEvent)
m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (m_hEvent && !m_hThread)
{
m_hThread = CreateThread (NULL, 0, CDebugCountdown::ThreadStartRoutine,
this, 0, &dwThreadId);
}
}
//---[ CDebugCountdown::SuspendCountdown ]-------------------------------------
//
//
// Description:
// Suspends the countdown until the Next ResetCountdown(). Designed to
// be used when another component's shutdown routine is called (like cat),
// and it is expected that they will provide there own stop hints.
// Parameters:
// -
// Returns:
// -
// History:
// 10/28/98 - MikeSwa Created
//
//-----------------------------------------------------------------------------
void CDebugCountdown::SuspendCountdown()
{
m_dwFlags = DEBUG_COUNTDOWN_SUSPENDED;
}
//---[ CDebugCountdown::ResetCountdown ]---------------------------------------
//
//
// Description:
// Causes thread to wake up and start waiting again. Will also reset a
// suspended countdown.
// Parameters:
// -
// Returns:
// -
// History:
// 10/28/98 - MikeSwa Created
//
//-----------------------------------------------------------------------------
void CDebugCountdown::ResetCountdown()
{
m_dwFlags = 0;
if (m_hEvent)
_VERIFY(SetEvent(m_hEvent));
}
//---[ CDebugCountdown::EndCountdown ]-----------------------------------------
//
//
// Description:
// Terminates the countdown and waits for the waiting thread to exit.
// Parameters:
// -
// Returns:
// -
// History:
// 10/28/98 - MikeSwa Created
//
//-----------------------------------------------------------------------------
void CDebugCountdown::EndCountdown()
{
m_dwFlags = DEBUG_COUNTDOWN_ENDED;
if (m_hEvent)
{
_VERIFY(SetEvent(m_hEvent));
//Wait for thread to exit
if (m_hThread)
{
WaitForSingleObject(m_hThread, INFINITE);
_VERIFY(CloseHandle(m_hThread));
m_hThread = NULL;
}
}
}
#endif //DEBUG