allow-rx-shutdown-for-userlevel-20010212
[openafs.git] / src / rx / rx_clock_nt.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* Elapsed time package */
11 /* See rx_clock.h for calling conventions */
12
13 #include <afs/param.h>
14 #ifdef AFS_NT40_ENV
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <windef.h>
18 #include <winbase.h>
19 #include "rx_clock.h"
20
21 struct clock clock_now; /* The last elapsed time ready by clock_GetTimer */
22
23 /* This is set to 1 whenever the time is read, and reset to 0 whenever
24  * clock_NewTime is called.  This is to allow the caller to control the
25  * frequency with which the actual time is re-evaluated.
26  */
27 int clock_haveCurrentTime;
28
29 int clock_nUpdates;             /* The actual number of clock updates */
30 static int clockInitialized = 0;
31
32 /* Timing tests show that we can compute times at about 4uS per call. */
33 LARGE_INTEGER rxi_clock0;
34 LARGE_INTEGER rxi_clockFreq;
35 void clock_Init()
36 {
37     if (!QueryPerformanceFrequency(&rxi_clockFreq)) {
38         printf("No High Performance clock, exiting.\n");
39         exit(1);
40     }
41
42     clockInitialized = 1;
43     (void) QueryPerformanceCounter(&rxi_clock0);
44
45     clock_UpdateTime();
46 }
47
48 #ifndef KERNEL
49 /* Make clock uninitialized. */
50 clock_UnInit()
51 {
52     clockInitialized = 0;
53 }
54 #endif
55
56 void clock_UpdateTime(void)
57 {
58     LARGE_INTEGER now, delta;
59     double seconds;
60
61     (void) QueryPerformanceCounter(&now);
62
63     delta.QuadPart = now.QuadPart - rxi_clock0.QuadPart;
64
65     seconds = (double)delta.QuadPart / (double)rxi_clockFreq.QuadPart;
66
67     clock_now.sec = (int) seconds;
68     clock_now.usec = (int) ((seconds - (double)clock_now.sec)
69                             * (double)1000000);
70     clock_haveCurrentTime = 1;
71     clock_nUpdates++;
72
73 }
74 #endif /* AFS_NT40_ENV */