1 #pragma once
2 
3 #define __NEED_struct_timespec
4 
5 #include "threads_impl.h"
6 
7 #include <bits/alltypes.h>
8 #include <zircon/time.h>
9 #include <zircon/types.h>
10 
__duration_timespec_to_deadline(const struct timespec timespec)11 static inline zx_time_t __duration_timespec_to_deadline(const struct timespec timespec) {
12     zx_duration_t nanos = zx_duration_add_duration(
13         zx_duration_mul_int64(1000000000ll, timespec.tv_sec),
14         timespec.tv_nsec);
15     return _zx_deadline_after(nanos);
16 }
17 
__timespec_to_deadline(const struct timespec * timespec,clockid_t clk,zx_time_t * deadline)18 static inline int __timespec_to_deadline(const struct timespec* timespec,
19                                          clockid_t clk, zx_time_t* deadline) {
20     struct timespec to;
21 
22     if (timespec->tv_nsec >= ZX_SEC(1))
23         return EINVAL;
24     if (__clock_gettime(clk, &to))
25         return EINVAL;
26     to.tv_sec = timespec->tv_sec - to.tv_sec;
27     if ((to.tv_nsec = timespec->tv_nsec - to.tv_nsec) < 0) {
28         to.tv_sec--;
29         to.tv_nsec += ZX_SEC(1);
30     }
31     if (to.tv_sec < 0)
32         return ETIMEDOUT;
33     *deadline = __duration_timespec_to_deadline(to);
34     return 0;
35 }
36