summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/miscellaneous/queryperformancecounter/test1/test1.c
blob: 55b173add7cda2166e64bf28c885d5eb9619b4a4 (plain)
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;
}