1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2008-2010 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*61046927SAndroid Build Coastguard Worker * of the Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker /**
29*61046927SAndroid Build Coastguard Worker * @file
30*61046927SAndroid Build Coastguard Worker * OS independent time-manipulation functions.
31*61046927SAndroid Build Coastguard Worker *
32*61046927SAndroid Build Coastguard Worker * @author Jose Fonseca <[email protected]>
33*61046927SAndroid Build Coastguard Worker */
34*61046927SAndroid Build Coastguard Worker
35*61046927SAndroid Build Coastguard Worker #ifndef _OS_TIME_H_
36*61046927SAndroid Build Coastguard Worker #define _OS_TIME_H_
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
39*61046927SAndroid Build Coastguard Worker #include <stdint.h>
40*61046927SAndroid Build Coastguard Worker #include <time.h>
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
43*61046927SAndroid Build Coastguard Worker extern "C" {
44*61046927SAndroid Build Coastguard Worker #endif
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker #define ONE_SECOND_IN_NS INT64_C(1000000000)
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker #define OS_TIMEOUT_INFINITE 0xffffffffffffffffull
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker /*
51*61046927SAndroid Build Coastguard Worker * Get the current time in nanoseconds from an unknown base.
52*61046927SAndroid Build Coastguard Worker */
53*61046927SAndroid Build Coastguard Worker int64_t
54*61046927SAndroid Build Coastguard Worker os_time_get_nano(void);
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker /*
58*61046927SAndroid Build Coastguard Worker * Get the current time in microseconds from an unknown base.
59*61046927SAndroid Build Coastguard Worker */
60*61046927SAndroid Build Coastguard Worker static inline int64_t
os_time_get(void)61*61046927SAndroid Build Coastguard Worker os_time_get(void)
62*61046927SAndroid Build Coastguard Worker {
63*61046927SAndroid Build Coastguard Worker return os_time_get_nano() / 1000;
64*61046927SAndroid Build Coastguard Worker }
65*61046927SAndroid Build Coastguard Worker
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker static inline struct tm *
os_localtime(const time_t * timer,struct tm * buf)68*61046927SAndroid Build Coastguard Worker os_localtime(const time_t *timer, struct tm *buf)
69*61046927SAndroid Build Coastguard Worker {
70*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
71*61046927SAndroid Build Coastguard Worker return localtime_s(buf, timer) ? NULL : buf;
72*61046927SAndroid Build Coastguard Worker #else
73*61046927SAndroid Build Coastguard Worker return localtime_r(timer, buf);
74*61046927SAndroid Build Coastguard Worker #endif
75*61046927SAndroid Build Coastguard Worker }
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker /*
79*61046927SAndroid Build Coastguard Worker * Sleep.
80*61046927SAndroid Build Coastguard Worker */
81*61046927SAndroid Build Coastguard Worker void
82*61046927SAndroid Build Coastguard Worker os_time_sleep(int64_t usecs);
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker /*
86*61046927SAndroid Build Coastguard Worker * Helper function for detecting time outs, taking in account overflow.
87*61046927SAndroid Build Coastguard Worker *
88*61046927SAndroid Build Coastguard Worker * Returns true if the current time has elapsed beyond the specified interval.
89*61046927SAndroid Build Coastguard Worker */
90*61046927SAndroid Build Coastguard Worker static inline bool
os_time_timeout(int64_t start,int64_t end,int64_t curr)91*61046927SAndroid Build Coastguard Worker os_time_timeout(int64_t start,
92*61046927SAndroid Build Coastguard Worker int64_t end,
93*61046927SAndroid Build Coastguard Worker int64_t curr)
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker if (start <= end)
96*61046927SAndroid Build Coastguard Worker return !(start <= curr && curr < end);
97*61046927SAndroid Build Coastguard Worker else
98*61046927SAndroid Build Coastguard Worker return !((start <= curr) || (curr < end));
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker /**
103*61046927SAndroid Build Coastguard Worker * Convert a relative timeout in nanoseconds into an absolute timeout,
104*61046927SAndroid Build Coastguard Worker * in other words, it returns current time + timeout.
105*61046927SAndroid Build Coastguard Worker * os_time_get_nano() must be monotonic.
106*61046927SAndroid Build Coastguard Worker * OS_TIMEOUT_INFINITE is passed through unchanged. If the calculation
107*61046927SAndroid Build Coastguard Worker * overflows, OS_TIMEOUT_INFINITE is returned.
108*61046927SAndroid Build Coastguard Worker */
109*61046927SAndroid Build Coastguard Worker int64_t
110*61046927SAndroid Build Coastguard Worker os_time_get_absolute_timeout(uint64_t timeout);
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker /**
114*61046927SAndroid Build Coastguard Worker * Wait until the variable at the given memory location is zero.
115*61046927SAndroid Build Coastguard Worker *
116*61046927SAndroid Build Coastguard Worker * \param var variable
117*61046927SAndroid Build Coastguard Worker * \param timeout timeout in ns, can be anything from 0 (no wait) to
118*61046927SAndroid Build Coastguard Worker * OS_TIMEOUT_INFINITE (wait forever)
119*61046927SAndroid Build Coastguard Worker * \return true if the variable is zero
120*61046927SAndroid Build Coastguard Worker */
121*61046927SAndroid Build Coastguard Worker bool
122*61046927SAndroid Build Coastguard Worker os_wait_until_zero(volatile int *var, uint64_t timeout);
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker /**
126*61046927SAndroid Build Coastguard Worker * Wait until the variable at the given memory location is zero.
127*61046927SAndroid Build Coastguard Worker * The timeout is the absolute time when the waiting should stop. If it is
128*61046927SAndroid Build Coastguard Worker * less than or equal to the current time, it only returns the status and
129*61046927SAndroid Build Coastguard Worker * doesn't wait. OS_TIMEOUT_INFINITE waits forever. This requires that
130*61046927SAndroid Build Coastguard Worker * os_time_get_nano is monotonic.
131*61046927SAndroid Build Coastguard Worker *
132*61046927SAndroid Build Coastguard Worker * \param var variable
133*61046927SAndroid Build Coastguard Worker * \param timeout the time in ns when the waiting should stop
134*61046927SAndroid Build Coastguard Worker * \return true if the variable is zero
135*61046927SAndroid Build Coastguard Worker */
136*61046927SAndroid Build Coastguard Worker bool
137*61046927SAndroid Build Coastguard Worker os_wait_until_zero_abs_timeout(volatile int *var, int64_t timeout);
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker #endif
142*61046927SAndroid Build Coastguard Worker
143*61046927SAndroid Build Coastguard Worker #endif /* _OS_TIME_H_ */
144