1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
/*============================================================
**
** Source: test1.c
**
** Purpose: Test for QueryPerformanceCounter function
**
**
**=========================================================*/
/* Depends on: QueryPerformanceFrequency. */
#include <palsuite.h>
/* Milliseconds of error which are acceptable Function execution time, etc.
FreeBSD has a "standard" resolution of 50ms for waiting operations, so we
must take that into account as well */
DWORD AcceptableTimeError = 15;
int __cdecl main(int argc, char *argv[])
{
int i;
int NumIterations = 100;
DWORD AvgTimeDiff;
DWORD TimeDiff[100];
DWORD TotalTimeDiff = 0;
DWORD SleepInterval = 50;
LARGE_INTEGER StartTime;
LARGE_INTEGER EndTime;
LARGE_INTEGER Freq;
/* Initialize the PAL.
*/
if(0 != (PAL_Initialize(argc, argv)))
{
return FAIL;
}
/* Get the frequency of the High-Performance Counter,
* in order to convert counter time to milliseconds.
*/
if (!QueryPerformanceFrequency(&Freq))
{
Fail("ERROR:%u:Unable to retrieve the frequency of the "
"high-resolution performance counter.\n",
GetLastError());
}
/* Perform this set of sleep timings a number of times.
*/
for(i=0; i < NumIterations; i++)
{
/* Get the current counter value.
*/
if (!QueryPerformanceCounter(&StartTime))
{
Fail("ERROR:%u:Unable to retrieve the current value of the "
"high-resolution performance counter.\n",
GetLastError());
}
/* Sleep a predetermined interval.
*/
Sleep(SleepInterval);
/* Get the new current counter value.
*/
if (!QueryPerformanceCounter(&EndTime))
{
Fail("ERROR:%u:Unable to retrieve the current value of the "
"high-resolution performance counter.\n",
GetLastError());
}
/* Determine elapsed time, in milliseconds. Compare the elapsed time
* with the sleep interval, and add to counter.
*/
TimeDiff[i] = (DWORD)(((EndTime.QuadPart - StartTime.QuadPart)*1000)/
(Freq.QuadPart));
TotalTimeDiff += TimeDiff[i] - SleepInterval;
}
/* Verify that the average of the difference between the performance
* counter and the sleep interval is within our acceptable range.
*/
AvgTimeDiff = TotalTimeDiff / NumIterations;
if (AvgTimeDiff > AcceptableTimeError)
{
Fail("ERROR: average diff %u acceptable %u.\n",
AvgTimeDiff,
AcceptableTimeError);
}
/* Terminate the PAL.
*/
PAL_Terminate();
return PASS;
}
|