1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | |
5 | /*============================================================ |
6 | ** |
7 | ** Source: |
8 | ** |
9 | ** Source : test1.c |
10 | ** |
11 | ** Purpose: Test for QueryThreadCycleTime() function |
12 | ** |
13 | ** |
14 | **=========================================================*/ |
15 | |
16 | #include <palsuite.h> |
17 | |
18 | int __cdecl main(int argc, char *argv[]) { |
19 | int ret = FAIL; |
20 | |
21 | //Test is failing unreliably, so for now we always return pass. |
22 | if (TRUE){ |
23 | ret = PASS; |
24 | goto EXIT; |
25 | } |
26 | { |
27 | LONG64 Actual, Expected, Delta = 850000000; |
28 | Actual = 0; |
29 | Expected = 0; |
30 | const LONG64 MSEC_TO_NSEC = 1000000; |
31 | |
32 | /* |
33 | * Initialize the PAL and return FAILURE if this fails |
34 | */ |
35 | |
36 | if(0 != (PAL_Initialize(argc, argv))) |
37 | { |
38 | return FAIL; |
39 | } |
40 | |
41 | HANDLE cThread = GetCurrentThread(); |
42 | |
43 | int i; |
44 | /* Take 2000 tiny measurements */ |
45 | for (i = 0; i < 2000; i++){ |
46 | ULONG64 FirstCount, SecondCount; |
47 | LONG64 Init; |
48 | |
49 | Sleep(1); |
50 | |
51 | /* Grab a FirstCount, then loop for a bit to make the clock increase */ |
52 | if (!QueryThreadCycleTime(cThread, (PULONG64)&FirstCount)) |
53 | { |
54 | Fail("ERROR: QueryThreadCycleTime returned failure.\n" ); |
55 | } |
56 | |
57 | LONG64 x; |
58 | /* Init is in milliseconds, so we will convert later */ |
59 | Init = (LONG64)GetTickCount(); |
60 | x = Init + 3; |
61 | volatile int counter; |
62 | do { |
63 | for (counter = 0; counter < 100000; counter++) |
64 | { |
65 | // spin to consume CPU time |
66 | } |
67 | |
68 | } while (x > GetTickCount()); |
69 | Expected += (GetTickCount() - Init) * MSEC_TO_NSEC; |
70 | /* Get a second count */ |
71 | if (!QueryThreadCycleTime(cThread, (PULONG64)&SecondCount)) |
72 | { |
73 | Fail("ERROR: QueryThreadCycleTime returned failure.\n" ); |
74 | } |
75 | |
76 | LONG64 trial = (LONG64)SecondCount - (LONG64)FirstCount; |
77 | if (trial < 0){ |
78 | printf("Negative value %llu measured" , trial); |
79 | } |
80 | Actual += (trial); |
81 | |
82 | } |
83 | |
84 | |
85 | |
86 | if(labs(Expected - Actual) > Delta) |
87 | { |
88 | Fail("ERROR: The measured time (%llu millisecs) was not within Delta %llu " |
89 | "of the expected time (%llu millisecs).\n" , |
90 | (Actual / MSEC_TO_NSEC), (Delta / MSEC_TO_NSEC), (Expected / MSEC_TO_NSEC)); |
91 | } |
92 | //printf("%llu, %llu\n", Expected, Actual); |
93 | PAL_Terminate(); |
94 | ret = PASS; |
95 | } |
96 | EXIT: |
97 | return ret; |
98 | } |
99 | |