xref: /aosp_15_r20/external/mesa3d/src/util/timespec.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2014 - 2015 Collabora, Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
5*61046927SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files (the
6*61046927SAndroid Build Coastguard Worker  * "Software"), to deal in the Software without restriction, including
7*61046927SAndroid Build Coastguard Worker  * without limitation the rights to use, copy, modify, merge, publish,
8*61046927SAndroid Build Coastguard Worker  * distribute, sublicense, and/or sell copies of the Software, and to
9*61046927SAndroid Build Coastguard Worker  * permit persons to whom the Software is furnished to do so, subject to
10*61046927SAndroid Build Coastguard Worker  * the following conditions:
11*61046927SAndroid Build Coastguard Worker  *
12*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the
13*61046927SAndroid Build Coastguard Worker  * next paragraph) shall be included in all copies or substantial
14*61046927SAndroid Build Coastguard Worker  * portions of the Software.
15*61046927SAndroid Build Coastguard Worker  *
16*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*61046927SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*61046927SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19*61046927SAndroid Build Coastguard Worker  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20*61046927SAndroid Build Coastguard Worker  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21*61046927SAndroid Build Coastguard Worker  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22*61046927SAndroid Build Coastguard Worker  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker /**
27*61046927SAndroid Build Coastguard Worker  * \file timespec.h
28*61046927SAndroid Build Coastguard Worker  *
29*61046927SAndroid Build Coastguard Worker  * Helpers to deal with timespec structures.
30*61046927SAndroid Build Coastguard Worker  */
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #ifndef TIMESPEC_H
33*61046927SAndroid Build Coastguard Worker #define TIMESPEC_H
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include <stdint.h>
36*61046927SAndroid Build Coastguard Worker #include <assert.h>
37*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker #include "c11/time.h"
40*61046927SAndroid Build Coastguard Worker #include "macros.h"
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #define NSEC_PER_SEC 1000000000
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker /**
45*61046927SAndroid Build Coastguard Worker  * Add timespecs
46*61046927SAndroid Build Coastguard Worker  *
47*61046927SAndroid Build Coastguard Worker  * \param r[out] result: a + b
48*61046927SAndroid Build Coastguard Worker  * \param a[in] operand
49*61046927SAndroid Build Coastguard Worker  * \param b[in] operand
50*61046927SAndroid Build Coastguard Worker  */
51*61046927SAndroid Build Coastguard Worker static inline void
timespec_add(struct timespec * r,const struct timespec * a,const struct timespec * b)52*61046927SAndroid Build Coastguard Worker timespec_add(struct timespec *r,
53*61046927SAndroid Build Coastguard Worker              const struct timespec *a, const struct timespec *b)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker    r->tv_sec = a->tv_sec + b->tv_sec;
56*61046927SAndroid Build Coastguard Worker    r->tv_nsec = a->tv_nsec + b->tv_nsec;
57*61046927SAndroid Build Coastguard Worker    if (r->tv_nsec > NSEC_PER_SEC) {
58*61046927SAndroid Build Coastguard Worker       r->tv_sec++;
59*61046927SAndroid Build Coastguard Worker       r->tv_nsec -= NSEC_PER_SEC;
60*61046927SAndroid Build Coastguard Worker    }
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker /**
64*61046927SAndroid Build Coastguard Worker  * Subtract timespecs
65*61046927SAndroid Build Coastguard Worker  *
66*61046927SAndroid Build Coastguard Worker  * \param r[out] result: a - b
67*61046927SAndroid Build Coastguard Worker  * \param a[in] operand
68*61046927SAndroid Build Coastguard Worker  * \param b[in] operand
69*61046927SAndroid Build Coastguard Worker  */
70*61046927SAndroid Build Coastguard Worker static inline void
timespec_sub(struct timespec * r,const struct timespec * a,const struct timespec * b)71*61046927SAndroid Build Coastguard Worker timespec_sub(struct timespec *r,
72*61046927SAndroid Build Coastguard Worker              const struct timespec *a, const struct timespec *b)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker    r->tv_sec = a->tv_sec - b->tv_sec;
75*61046927SAndroid Build Coastguard Worker    r->tv_nsec = a->tv_nsec - b->tv_nsec;
76*61046927SAndroid Build Coastguard Worker    if (r->tv_nsec < 0) {
77*61046927SAndroid Build Coastguard Worker       r->tv_sec--;
78*61046927SAndroid Build Coastguard Worker       r->tv_nsec += NSEC_PER_SEC;
79*61046927SAndroid Build Coastguard Worker    }
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /**
83*61046927SAndroid Build Coastguard Worker  * Saturating timespec subtraction
84*61046927SAndroid Build Coastguard Worker  *
85*61046927SAndroid Build Coastguard Worker  * \param r[out] result: max(a - b, 0)
86*61046927SAndroid Build Coastguard Worker  * \param a[in] operand
87*61046927SAndroid Build Coastguard Worker  * \param b[in] operand
88*61046927SAndroid Build Coastguard Worker  */
89*61046927SAndroid Build Coastguard Worker static inline void
timespec_sub_saturate(struct timespec * r,const struct timespec * a,const struct timespec * b)90*61046927SAndroid Build Coastguard Worker timespec_sub_saturate(struct timespec *r,
91*61046927SAndroid Build Coastguard Worker                       const struct timespec *a, const struct timespec *b)
92*61046927SAndroid Build Coastguard Worker {
93*61046927SAndroid Build Coastguard Worker    timespec_sub(r, a, b);
94*61046927SAndroid Build Coastguard Worker    if (r->tv_sec < 0) {
95*61046927SAndroid Build Coastguard Worker       r->tv_sec = 0;
96*61046927SAndroid Build Coastguard Worker       r->tv_nsec = 0;
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker }
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker #define TIME_T_MAX \
101*61046927SAndroid Build Coastguard Worker    ((time_t)(((time_t)-1) > 0 ? u_uintN_max(sizeof(time_t) * 8) : \
102*61046927SAndroid Build Coastguard Worker                                 u_intN_max(sizeof(time_t) * 8)))
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker /**
105*61046927SAndroid Build Coastguard Worker  * Add a nanosecond value to a timespec
106*61046927SAndroid Build Coastguard Worker  *
107*61046927SAndroid Build Coastguard Worker  * \param r[out] result: a + b
108*61046927SAndroid Build Coastguard Worker  * \param a[in] base operand as timespec
109*61046927SAndroid Build Coastguard Worker  * \param b[in] operand in nanoseconds
110*61046927SAndroid Build Coastguard Worker  * \return true if the calculation overflowed
111*61046927SAndroid Build Coastguard Worker  */
112*61046927SAndroid Build Coastguard Worker static inline bool
timespec_add_nsec(struct timespec * r,const struct timespec * a,uint64_t b)113*61046927SAndroid Build Coastguard Worker timespec_add_nsec(struct timespec *r, const struct timespec *a, uint64_t b)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker    uint64_t b_sec = b / NSEC_PER_SEC;
116*61046927SAndroid Build Coastguard Worker    long b_nsec = b % NSEC_PER_SEC;
117*61046927SAndroid Build Coastguard Worker    bool overflow = (b_sec > (uint64_t)TIME_T_MAX) ||
118*61046927SAndroid Build Coastguard Worker                    ((uint64_t)a->tv_sec > (uint64_t)TIME_T_MAX - b_sec);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    r->tv_sec = (uint64_t)a->tv_sec + b_sec;
121*61046927SAndroid Build Coastguard Worker    r->tv_nsec = (uint64_t)a->tv_nsec + b_nsec;
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    if (r->tv_nsec >= NSEC_PER_SEC) {
124*61046927SAndroid Build Coastguard Worker       if (r->tv_sec >= TIME_T_MAX)
125*61046927SAndroid Build Coastguard Worker          overflow = true;
126*61046927SAndroid Build Coastguard Worker       r->tv_sec = (uint64_t)r->tv_sec + 1ull;
127*61046927SAndroid Build Coastguard Worker       r->tv_nsec -= NSEC_PER_SEC;
128*61046927SAndroid Build Coastguard Worker    } else if (r->tv_nsec < 0) {
129*61046927SAndroid Build Coastguard Worker       assert(overflow);
130*61046927SAndroid Build Coastguard Worker       r->tv_sec--;
131*61046927SAndroid Build Coastguard Worker       r->tv_nsec += NSEC_PER_SEC;
132*61046927SAndroid Build Coastguard Worker    }
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    return overflow;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker /**
138*61046927SAndroid Build Coastguard Worker  * Add a millisecond value to a timespec
139*61046927SAndroid Build Coastguard Worker  *
140*61046927SAndroid Build Coastguard Worker  * \param r[out] result: a + b
141*61046927SAndroid Build Coastguard Worker  * \param a[in] base operand as timespec
142*61046927SAndroid Build Coastguard Worker  * \param b[in] operand in milliseconds
143*61046927SAndroid Build Coastguard Worker  * \return true if the calculation overflowed
144*61046927SAndroid Build Coastguard Worker  */
145*61046927SAndroid Build Coastguard Worker static inline bool
timespec_add_msec(struct timespec * r,const struct timespec * a,uint64_t b)146*61046927SAndroid Build Coastguard Worker timespec_add_msec(struct timespec *r, const struct timespec *a, uint64_t b)
147*61046927SAndroid Build Coastguard Worker {
148*61046927SAndroid Build Coastguard Worker    return timespec_add_nsec(r, a, b * 1000000) || b > (UINT64_MAX / 1000000);
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker /**
152*61046927SAndroid Build Coastguard Worker  * Convert timespec to nanoseconds
153*61046927SAndroid Build Coastguard Worker  *
154*61046927SAndroid Build Coastguard Worker  * \param a timespec
155*61046927SAndroid Build Coastguard Worker  * \return nanoseconds
156*61046927SAndroid Build Coastguard Worker  */
157*61046927SAndroid Build Coastguard Worker static inline uint64_t
timespec_to_nsec(const struct timespec * a)158*61046927SAndroid Build Coastguard Worker timespec_to_nsec(const struct timespec *a)
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker    return (uint64_t)a->tv_sec * NSEC_PER_SEC + a->tv_nsec;
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker /**
164*61046927SAndroid Build Coastguard Worker  * Subtract timespecs and return result in nanoseconds
165*61046927SAndroid Build Coastguard Worker  *
166*61046927SAndroid Build Coastguard Worker  * \param a[in] operand
167*61046927SAndroid Build Coastguard Worker  * \param b[in] operand
168*61046927SAndroid Build Coastguard Worker  * \return to_nanoseconds(a - b)
169*61046927SAndroid Build Coastguard Worker  */
170*61046927SAndroid Build Coastguard Worker static inline uint64_t
timespec_sub_to_nsec(const struct timespec * a,const struct timespec * b)171*61046927SAndroid Build Coastguard Worker timespec_sub_to_nsec(const struct timespec *a, const struct timespec *b)
172*61046927SAndroid Build Coastguard Worker {
173*61046927SAndroid Build Coastguard Worker    struct timespec r;
174*61046927SAndroid Build Coastguard Worker    timespec_sub(&r, a, b);
175*61046927SAndroid Build Coastguard Worker    return timespec_to_nsec(&r);
176*61046927SAndroid Build Coastguard Worker }
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker /**
179*61046927SAndroid Build Coastguard Worker  * Convert timespec to milliseconds
180*61046927SAndroid Build Coastguard Worker  *
181*61046927SAndroid Build Coastguard Worker  * \param a timespec
182*61046927SAndroid Build Coastguard Worker  * \return milliseconds
183*61046927SAndroid Build Coastguard Worker  *
184*61046927SAndroid Build Coastguard Worker  * Rounding to integer milliseconds happens always down (floor()).
185*61046927SAndroid Build Coastguard Worker  */
186*61046927SAndroid Build Coastguard Worker static inline uint64_t
timespec_to_msec(const struct timespec * a)187*61046927SAndroid Build Coastguard Worker timespec_to_msec(const struct timespec *a)
188*61046927SAndroid Build Coastguard Worker {
189*61046927SAndroid Build Coastguard Worker    return (uint64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000;
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker /**
193*61046927SAndroid Build Coastguard Worker  * Subtract timespecs and return result in milliseconds
194*61046927SAndroid Build Coastguard Worker  *
195*61046927SAndroid Build Coastguard Worker  * \param a[in] operand
196*61046927SAndroid Build Coastguard Worker  * \param b[in] operand
197*61046927SAndroid Build Coastguard Worker  * \return to_milliseconds(a - b)
198*61046927SAndroid Build Coastguard Worker  */
199*61046927SAndroid Build Coastguard Worker static inline uint64_t
timespec_sub_to_msec(const struct timespec * a,const struct timespec * b)200*61046927SAndroid Build Coastguard Worker timespec_sub_to_msec(const struct timespec *a, const struct timespec *b)
201*61046927SAndroid Build Coastguard Worker {
202*61046927SAndroid Build Coastguard Worker    return timespec_sub_to_nsec(a, b) / 1000000;
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker 
205*61046927SAndroid Build Coastguard Worker /**
206*61046927SAndroid Build Coastguard Worker  * Convert timespec to microseconds
207*61046927SAndroid Build Coastguard Worker  *
208*61046927SAndroid Build Coastguard Worker  * \param a timespec
209*61046927SAndroid Build Coastguard Worker  * \return microseconds
210*61046927SAndroid Build Coastguard Worker  *
211*61046927SAndroid Build Coastguard Worker  * Rounding to integer microseconds happens always down (floor()).
212*61046927SAndroid Build Coastguard Worker  */
213*61046927SAndroid Build Coastguard Worker static inline uint64_t
timespec_to_usec(const struct timespec * a)214*61046927SAndroid Build Coastguard Worker timespec_to_usec(const struct timespec *a)
215*61046927SAndroid Build Coastguard Worker {
216*61046927SAndroid Build Coastguard Worker    return (uint64_t)a->tv_sec * 1000000 + a->tv_nsec / 1000;
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker /**
220*61046927SAndroid Build Coastguard Worker  * Convert timespec to protocol data
221*61046927SAndroid Build Coastguard Worker  *
222*61046927SAndroid Build Coastguard Worker  * \param a timespec
223*61046927SAndroid Build Coastguard Worker  * \param tv_sec_hi[out] the high bytes of the seconds part
224*61046927SAndroid Build Coastguard Worker  * \param tv_sec_lo[out] the low bytes of the seconds part
225*61046927SAndroid Build Coastguard Worker  * \param tv_nsec[out] the nanoseconds part
226*61046927SAndroid Build Coastguard Worker  *
227*61046927SAndroid Build Coastguard Worker  * The input timespec must be normalized (the nanoseconds part should
228*61046927SAndroid Build Coastguard Worker  * be less than 1 second) and non-negative.
229*61046927SAndroid Build Coastguard Worker  */
230*61046927SAndroid Build Coastguard Worker static inline void
timespec_to_proto(const struct timespec * a,uint32_t * tv_sec_hi,uint32_t * tv_sec_lo,uint32_t * tv_nsec)231*61046927SAndroid Build Coastguard Worker timespec_to_proto(const struct timespec *a, uint32_t *tv_sec_hi,
232*61046927SAndroid Build Coastguard Worker                   uint32_t *tv_sec_lo, uint32_t *tv_nsec)
233*61046927SAndroid Build Coastguard Worker {
234*61046927SAndroid Build Coastguard Worker    assert(a->tv_sec >= 0);
235*61046927SAndroid Build Coastguard Worker    assert(a->tv_nsec >= 0 && a->tv_nsec < NSEC_PER_SEC);
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    uint64_t sec64 = a->tv_sec;
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    *tv_sec_hi = sec64 >> 32;
240*61046927SAndroid Build Coastguard Worker    *tv_sec_lo = sec64 & 0xffffffff;
241*61046927SAndroid Build Coastguard Worker    *tv_nsec = a->tv_nsec;
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker /**
245*61046927SAndroid Build Coastguard Worker  * Convert nanoseconds to timespec
246*61046927SAndroid Build Coastguard Worker  *
247*61046927SAndroid Build Coastguard Worker  * \param a timespec
248*61046927SAndroid Build Coastguard Worker  * \param b nanoseconds
249*61046927SAndroid Build Coastguard Worker  */
250*61046927SAndroid Build Coastguard Worker static inline void
timespec_from_nsec(struct timespec * a,uint64_t b)251*61046927SAndroid Build Coastguard Worker timespec_from_nsec(struct timespec *a, uint64_t b)
252*61046927SAndroid Build Coastguard Worker {
253*61046927SAndroid Build Coastguard Worker    a->tv_sec = b / NSEC_PER_SEC;
254*61046927SAndroid Build Coastguard Worker    a->tv_nsec = b % NSEC_PER_SEC;
255*61046927SAndroid Build Coastguard Worker }
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker /**
258*61046927SAndroid Build Coastguard Worker  * Convert microseconds to timespec
259*61046927SAndroid Build Coastguard Worker  *
260*61046927SAndroid Build Coastguard Worker  * \param a timespec
261*61046927SAndroid Build Coastguard Worker  * \param b microseconds
262*61046927SAndroid Build Coastguard Worker  */
263*61046927SAndroid Build Coastguard Worker static inline void
timespec_from_usec(struct timespec * a,uint64_t b)264*61046927SAndroid Build Coastguard Worker timespec_from_usec(struct timespec *a, uint64_t b)
265*61046927SAndroid Build Coastguard Worker {
266*61046927SAndroid Build Coastguard Worker    timespec_from_nsec(a, b * 1000);
267*61046927SAndroid Build Coastguard Worker }
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker /**
270*61046927SAndroid Build Coastguard Worker  * Convert milliseconds to timespec
271*61046927SAndroid Build Coastguard Worker  *
272*61046927SAndroid Build Coastguard Worker  * \param a timespec
273*61046927SAndroid Build Coastguard Worker  * \param b milliseconds
274*61046927SAndroid Build Coastguard Worker  */
275*61046927SAndroid Build Coastguard Worker static inline void
timespec_from_msec(struct timespec * a,uint64_t b)276*61046927SAndroid Build Coastguard Worker timespec_from_msec(struct timespec *a, uint64_t b)
277*61046927SAndroid Build Coastguard Worker {
278*61046927SAndroid Build Coastguard Worker    timespec_from_nsec(a, b * 1000000);
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker 
281*61046927SAndroid Build Coastguard Worker /**
282*61046927SAndroid Build Coastguard Worker  * Convert protocol data to timespec
283*61046927SAndroid Build Coastguard Worker  *
284*61046927SAndroid Build Coastguard Worker  * \param a[out] timespec
285*61046927SAndroid Build Coastguard Worker  * \param tv_sec_hi the high bytes of seconds part
286*61046927SAndroid Build Coastguard Worker  * \param tv_sec_lo the low bytes of seconds part
287*61046927SAndroid Build Coastguard Worker  * \param tv_nsec the nanoseconds part
288*61046927SAndroid Build Coastguard Worker  */
289*61046927SAndroid Build Coastguard Worker static inline void
timespec_from_proto(struct timespec * a,uint32_t tv_sec_hi,uint32_t tv_sec_lo,uint32_t tv_nsec)290*61046927SAndroid Build Coastguard Worker timespec_from_proto(struct timespec *a, uint32_t tv_sec_hi,
291*61046927SAndroid Build Coastguard Worker                     uint32_t tv_sec_lo, uint32_t tv_nsec)
292*61046927SAndroid Build Coastguard Worker {
293*61046927SAndroid Build Coastguard Worker    a->tv_sec = ((uint64_t)tv_sec_hi << 32) + tv_sec_lo;
294*61046927SAndroid Build Coastguard Worker    a->tv_nsec = tv_nsec;
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker /**
298*61046927SAndroid Build Coastguard Worker  * Check if a timespec is zero
299*61046927SAndroid Build Coastguard Worker  *
300*61046927SAndroid Build Coastguard Worker  * \param a timespec
301*61046927SAndroid Build Coastguard Worker  * \return whether the timespec is zero
302*61046927SAndroid Build Coastguard Worker  */
303*61046927SAndroid Build Coastguard Worker static inline bool
timespec_is_zero(const struct timespec * a)304*61046927SAndroid Build Coastguard Worker timespec_is_zero(const struct timespec *a)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker    return a->tv_sec == 0 && a->tv_nsec == 0;
307*61046927SAndroid Build Coastguard Worker }
308*61046927SAndroid Build Coastguard Worker 
309*61046927SAndroid Build Coastguard Worker /**
310*61046927SAndroid Build Coastguard Worker  * Check if two timespecs are equal
311*61046927SAndroid Build Coastguard Worker  *
312*61046927SAndroid Build Coastguard Worker  * \param a[in] timespec to check
313*61046927SAndroid Build Coastguard Worker  * \param b[in] timespec to check
314*61046927SAndroid Build Coastguard Worker  * \return whether timespecs a and b are equal
315*61046927SAndroid Build Coastguard Worker  */
316*61046927SAndroid Build Coastguard Worker static inline bool
timespec_eq(const struct timespec * a,const struct timespec * b)317*61046927SAndroid Build Coastguard Worker timespec_eq(const struct timespec *a, const struct timespec *b)
318*61046927SAndroid Build Coastguard Worker {
319*61046927SAndroid Build Coastguard Worker    return a->tv_sec == b->tv_sec &&
320*61046927SAndroid Build Coastguard Worker       a->tv_nsec == b->tv_nsec;
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker /**
324*61046927SAndroid Build Coastguard Worker  * Convert milli-Hertz to nanoseconds
325*61046927SAndroid Build Coastguard Worker  *
326*61046927SAndroid Build Coastguard Worker  * \param mhz frequency in mHz, not zero
327*61046927SAndroid Build Coastguard Worker  * \return period in nanoseconds
328*61046927SAndroid Build Coastguard Worker  */
329*61046927SAndroid Build Coastguard Worker static inline uint64_t
millihz_to_nsec(uint32_t mhz)330*61046927SAndroid Build Coastguard Worker millihz_to_nsec(uint32_t mhz)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker    assert(mhz > 0);
333*61046927SAndroid Build Coastguard Worker    return 1000000000000LL / mhz;
334*61046927SAndroid Build Coastguard Worker }
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker /**
337*61046927SAndroid Build Coastguard Worker  * Checks whether a timespec value is after another
338*61046927SAndroid Build Coastguard Worker  *
339*61046927SAndroid Build Coastguard Worker  * \param a[in] timespec to compare
340*61046927SAndroid Build Coastguard Worker  * \param b[in] timespec to compare
341*61046927SAndroid Build Coastguard Worker  * \return whether a is after b
342*61046927SAndroid Build Coastguard Worker  */
343*61046927SAndroid Build Coastguard Worker static inline bool
timespec_after(const struct timespec * a,const struct timespec * b)344*61046927SAndroid Build Coastguard Worker timespec_after(const struct timespec *a, const struct timespec *b)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker    return (a->tv_sec == b->tv_sec) ?
347*61046927SAndroid Build Coastguard Worker       (a->tv_nsec > b->tv_nsec) :
348*61046927SAndroid Build Coastguard Worker       (a->tv_sec > b->tv_sec);
349*61046927SAndroid Build Coastguard Worker }
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker #endif /* TIMESPEC_H */
352