|
|
//
// MODULE: APIwraps.CPP
//
// PURPOSE: Encapsulate common blocks of API functionality within a class.
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// AUTHOR: Randy Biley
//
// ORIGINAL DATE: 9-30-98
//
// NOTES:
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 09-30-98 RAB
//
#include "stdafx.h"
#include "apiwraps.h"
#include "event.h"
#include "baseexception.h"
APIwraps::APIwraps() { }
APIwraps::~APIwraps() { }
// Function used to handle the situation where we wish to detect sluggish or stalled objects
// and log this delay before going into an infinite wait.
/*static*/ bool APIwraps::WaitAndLogIfSlow( HANDLE hndl, // Handle of object to be waited on.
LPCSTR srcFile, // Calling source file (__FILE__), used for logging.
// LPCSTR, not LPCTSTR, because __FILE__ is a char*, not a TCHAR*
int srcLine, // Calling source line (__LINE__), used for logging.
DWORD TimeOutVal /*=60000*/ // Time-out interval in millisecond. After
// this we log an error, then wait infinitely
) { bool bRetVal= false; DWORD nWaitRetVal; CBuildSrcFileLinenoStr SrcLoc( srcFile, srcLine );
nWaitRetVal= ::WaitForSingleObject( hndl, TimeOutVal ); if (nWaitRetVal == WAIT_FAILED) { // very bad news, should never happen
DWORD dwErr = ::GetLastError(); CString strErr; strErr.Format(_T("%d"), dwErr); CBuildSrcFileLinenoStr SrcLoc3(__FILE__, __LINE__); CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(), SrcLoc3.GetSrcFileLineStr(), _T("Thread wait failed."), strErr, EV_GTS_ERROR_STUCK_THREAD ); } else if (nWaitRetVal == WAIT_TIMEOUT) { // Initial wait timed out, note in log, and wait infinitely.
CBuildSrcFileLinenoStr SrcLoc1(__FILE__, __LINE__); CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(), SrcLoc1.GetSrcFileLineStr(), _T("Thread wait exceeded initial timeout interval."), _T(""), EV_GTS_STUCK_THREAD );
nWaitRetVal= ::WaitForSingleObject( hndl, INFINITE );
// If successfully got what we were waiting for (after logging an apparent
// problem), log the fact that it's ultimately OK.
if (nWaitRetVal == WAIT_OBJECT_0) { CBuildSrcFileLinenoStr SrcLoc2(__FILE__, __LINE__); CEvent::ReportWFEvent( SrcLoc.GetSrcFileLineStr(), SrcLoc2.GetSrcFileLineStr(), _T("Thread infinite wait succeeded."), _T(""), EV_GTS_STUCK_THREAD ); bRetVal= true; } } else { // We don't really care whether it's WAIT_OBJECT_0 or WAIT_ABANDONED.
// Either way, we got what we were waiting for
bRetVal= true; }
return( bRetVal ); }
//
// EOF.
//
|