/* Entry Point for child thread. */ DWORD PALAPI WaiterProc(LPVOID lpParameter) { HANDLE Semaphore; UINT64 OldTimeStamp; UINT64 NewTimeStamp; BOOL Alertable; DWORD ret; /* Create a semaphore that is not in the signalled state */ Semaphore = CreateSemaphoreW(NULL, 0, 1, NULL); if (Semaphore == NULL) { Fail("Failed to create semaphore! GetLastError returned %d.\n", GetLastError()); } Alertable = (BOOL) lpParameter; LARGE_INTEGER performanceFrequency; if (!QueryPerformanceFrequency(&performanceFrequency)) { Fail("Failed to query performance frequency!"); } OldTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); ret = WaitForMultipleObjectsEx(1, &Semaphore, FALSE, ChildThreadWaitTime, Alertable); NewTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); if (Alertable && ret != WAIT_IO_COMPLETION) { Fail("Expected the interrupted wait to return WAIT_IO_COMPLETION.\n" "Got %d\n", ret); } else if (!Alertable && ret != WAIT_TIMEOUT) { Fail("WaitForMultipleObjectsEx did not timeout.\n" "Expected return of WAIT_TIMEOUT, got %d.\n", ret); } ThreadWaitDelta = NewTimeStamp - OldTimeStamp; ret = CloseHandle(Semaphore); if (!ret) { Fail("Unable to close handle to semaphore!\n" "GetLastError returned %d\n", GetLastError()); } return 0; }
int __cdecl main( int argc, char **argv ) { UINT64 OldTimeStamp; UINT64 NewTimeStamp; DWORD MaxDelta; DWORD TimeDelta; DWORD i; if(0 != (PAL_Initialize(argc, argv))) { return ( FAIL ); } LARGE_INTEGER performanceFrequency; if (!QueryPerformanceFrequency(&performanceFrequency)) { return FAIL; } for( i = 0; i < sizeof(SleepTimes) / sizeof(DWORD); i++) { OldTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); Sleep(SleepTimes[i]); NewTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); TimeDelta = NewTimeStamp - OldTimeStamp; MaxDelta = SleepTimes[i] + AcceptableTimeError; if ( TimeDelta<SleepTimes[i] || TimeDelta>MaxDelta ) { Fail("The sleep function slept for %u ms when it should have " "slept for %u ms\n", TimeDelta, SleepTimes[i]); } } PAL_Terminate(); return ( PASS ); }
/* Entry Point for child thread. */ DWORD PALAPI WaiterProc(LPVOID lpParameter) { UINT64 OldTimeStamp; UINT64 NewTimeStamp; BOOL Alertable; DWORD ret; Alertable = (BOOL) lpParameter; LARGE_INTEGER performanceFrequency; if (!QueryPerformanceFrequency(&performanceFrequency)) { Fail("Failed to query performance frequency!"); } OldTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); ret = WaitForSingleObjectEx( hMutex, ChildThreadWaitTime, Alertable); NewTimeStamp = GetHighPrecisionTimeStamp(performanceFrequency); if (Alertable && ret != WAIT_IO_COMPLETION) { Fail("Expected the interrupted wait to return WAIT_IO_COMPLETION.\n" "Got %d\n", ret); } else if (!Alertable && ret != WAIT_TIMEOUT) { Fail("WaitForSingleObjectEx did not timeout.\n" "Expected return of WAIT_TIMEOUT, got %d.\n", ret); } ThreadWaitDelta = NewTimeStamp - OldTimeStamp; return 0; }