2 * Copyright 2000, International Business Machines Corporation and others.
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
10 /* Elapsed time package */
11 /* See rx_clock.h for calling conventions */
13 #include <afsconfig.h>
15 #include "afs/param.h"
17 #include <afs/param.h>
21 #include <sys/time_impl.h>
29 #include "rx/rx_clock.h"
33 #include "afs/sysincludes.h"
34 #include "afsincludes.h"
36 #include "rx/rx_clock.h"
47 #if !defined(AFS_USE_GETTIMEOFDAY)
48 /*use this package only if gettimeofday is much much costlier than getitime */
52 #define STARTVALUE 100000000 /* Max number of seconds setitimer allows, for some reason */
53 static int startvalue = STARTVALUE;
55 struct clock clock_now; /* The last elapsed time ready by clock_GetTimer */
57 /* This is set to 1 whenever the time is read, and reset to 0 whenever clock_NewTime is called. This is to allow the caller to control the frequency with which the actual time is re-evaluated (an expensive operation) */
58 int clock_haveCurrentTime;
60 int clock_nUpdates; /* The actual number of clock updates */
61 static int clockInitialized = 0;
63 /* Initialize the clock */
67 struct itimerval itimer, otimer;
69 if (!clockInitialized) {
70 itimer.it_value.tv_sec = STARTVALUE;
71 itimer.it_value.tv_usec = 0;
72 itimer.it_interval.tv_sec = 0;
73 itimer.it_interval.tv_usec = 0;
75 if (setitimer(ITIMER_REAL, &itimer, &otimer) != 0) {
76 fprintf(stderr, "clock: could not set interval timer; \
77 aborted(errno=%d)\n", errno);
81 getitimer(ITIMER_REAL, &itimer);
82 startvalue = itimer.it_value.tv_sec;
83 if (itimer.it_value.tv_usec > 0)
91 /* Make clock uninitialized. */
99 /* Compute the current time. The timer gets the current total elapsed time since startup, expressed in seconds and microseconds. This call is almost 200 usec on an APC RT */
101 clock_UpdateTime(void)
103 struct itimerval itimer;
104 getitimer(ITIMER_REAL, &itimer);
105 clock_now.sec = startvalue - 1 - itimer.it_value.tv_sec; /* The "-1" makes up for adding 1000000 usec, on the next line */
106 clock_now.usec = 1000000 - itimer.it_value.tv_usec;
107 if (clock_now.usec == 1000000)
108 clock_now.usec = 0, clock_now.sec++;
109 clock_haveCurrentTime = 1;
115 #endif /* AFS_USE_GETTIMEOFDAY */