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 GetThreadTimes() function
12**
13**
14**=========================================================*/
15
16#include <palsuite.h>
17
18int __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 FILETIME kernelTime1, userTime1, kernelTime2, userTime2;
28 /* Delta = .01 sec */
29 LONG64 Actual, Expected, Delta = 850000000;
30 Actual = 0;
31 Expected = 0;
32 const ULONG64 MSEC_TO_NSEC = 1000000;
33
34 /*
35 * Initialize the PAL and return FAILURE if this fails
36 */
37
38 if(0 != (PAL_Initialize(argc, argv)))
39 {
40 return FAIL;
41 }
42
43 HANDLE cThread = GetCurrentThread();
44
45 int i;
46 /* Take 2000 tiny measurements */
47 for (i = 0; i < 2000; i++){
48 ULONG64 Time1, Time2;
49
50 Sleep(1);
51
52 /* Grab a FirstCount, then loop for a bit to make the clock increase */
53 if (!GetThreadTimes(cThread, NULL, NULL, &kernelTime1, &userTime1))
54 {
55 Fail("ERROR: GetThreadTimes returned failure.\n");
56 }
57 LONG64 x, Init;
58 /* Init is in milliseconds, so we will convert later */
59 Init = (ULONG64)GetTickCount();
60 /* Spin for < 1 Quantum so we don't get interrupted */
61 x = Init + 3;
62 volatile int counter;
63 do {
64 for (counter = 0; counter < 100000; counter++)
65 {
66 // spin to consume CPU time
67 }
68
69 } while (x > GetTickCount());
70 Expected += (GetTickCount() - Init) * MSEC_TO_NSEC;
71 /* Get a second count */
72 if (!GetThreadTimes(cThread, NULL, NULL, &kernelTime2, &userTime2))
73 {
74 Fail("ERROR: GetThreadTimes returned failure.\n");
75 }
76
77 Time1 = ((ULONG64)kernelTime1.dwHighDateTime << 32);
78 Time1 += (ULONG64)kernelTime1.dwLowDateTime;
79 Time1 += ((ULONG64)userTime1.dwHighDateTime << 32);
80 Time1 += (ULONG64)userTime1.dwLowDateTime;
81
82 Time2 = ((ULONG64)kernelTime2.dwHighDateTime << 32);
83 Time2 += (ULONG64)kernelTime2.dwLowDateTime;
84 Time2 += ((ULONG64)userTime2.dwHighDateTime << 32);
85 Time2 += (ULONG64)userTime2.dwLowDateTime;
86
87 Actual += (Time2 - Time1) * 100;
88 }
89
90 if(labs(Expected - Actual) > Delta)
91 {
92 Fail("ERROR: The measured time (%llu millisecs) was not within Delta %llu "
93 "of the expected time (%llu millisecs).\n",
94 (Actual / MSEC_TO_NSEC), (Delta / MSEC_TO_NSEC), (Expected / MSEC_TO_NSEC));
95 }
96 //printf("%llu, %llu\n", Expected, Actual);
97 PAL_Terminate();
98 ret = PASS;
99 }
100EXIT:
101 return ret;
102}
103