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.
|
|
#include "stpwatch.h"
StopWatch_cl::StopWatch_cl() { m_Zero(); }
ULONG StopWatch_cl::sm_TicksPerSecond;
//
// Init global/static state of the StopWatch class.
//
BOOL StopWatch_cl::m_ClassInit() { LARGE_INTEGER liTPS; #ifdef WIN32
if(!QueryPerformanceFrequency(&liTPS) ) { MessageBox(0, TEXT("Can't read frequency"), TEXT("QueryPerformanceFrequency"), MB_OK); return FALSE; } if (liTPS.HighPart != 0) { MessageBox(0, TEXT("Ticks Per Second is to great"), TEXT("QueryPerformanceFrequency"), MB_OK); return FALSE; } sm_TicksPerSecond = liTPS.LowPart; #else
sm_TicksPerSecond = 1000; #endif
return TRUE; }
void StopWatch_cl::m_Zero() { LISet32(m_liStart, 0); LISet32(m_liStop, 0); m_State = ZEROED; }
BOOL StopWatch_cl::m_Start() { #ifdef WIN32
if(!QueryPerformanceCounter(&m_liStart)) { MessageBox(0, TEXT("Get Start Time Failure"), TEXT("QueryPerformancecounter Failed"), MB_OK); return FALSE; } #else
m_liStart.LowPart = GetTickCount(); m_liStart.HighPart = 0; #endif
m_State = RUNNING; return TRUE; }
// m_MeasureStop()
// Returns microseconds per single iteration.
//
BOOL StopWatch_cl::m_Stop() { #ifdef WIN32
if(!QueryPerformanceCounter(&m_liStop)) { MessageBox(0, TEXT("Get Stop Time Failure"), TEXT("QueryPerformancecounter Failed"), MB_OK); return FALSE; } #else
m_liStop.LowPart = GetTickCount(); m_liStop.HighPart = 0; #endif
m_State = STOPPED; return TRUE; }
BOOL StopWatch_cl::m_Sleep(UINT msecs) { #ifdef WIN32
Sleep(msecs); #else
UINT start, elapsed; start = GetTickCount(); do { elapsed = GetTickCount() - start; } while ( msecs > elapsed ); #endif
return TRUE; }
//
// Return a ULONG count of the number of Microseconds on the timer.
// I would return LARGE_INTEGER but there doesn't seem to be facilities
// to user them easily under 16 bit.
//
BOOL StopWatch_cl::m_Read(ULONG *p_cMicroSeconds) { LARGE_INTEGER liTicks;
int borrow = 0; if(m_liStart.LowPart > m_liStop.LowPart) borrow = 1; liTicks.LowPart = m_liStop.LowPart - m_liStart.LowPart; liTicks.HighPart = m_liStop.HighPart - m_liStart.HighPart - borrow;
if(0 != liTicks.HighPart) { MessageBox(0, TEXT("Time interval was too great"), TEXT("Failure"), MB_OK); return(FALSE); }
// result has units of (ticks/ loop of iterations). Where the ticks
// are timer specific. This will convert result into:
// (Milli_ticks) / (single iteration)
#ifdef WIN32
*p_cMicroSeconds = MulDiv(liTicks.LowPart, 1000000, sm_TicksPerSecond); #else
*p_cMicroSeconds = liTicks.LowPart * 1000; #endif
return TRUE; }
|