1 #include <threads.h>
2
3 #include <assert.h>
4 #include <zircon/syscalls.h>
5
6 #include "time_conversion.h"
7
thrd_sleep(const struct timespec * req,struct timespec * rem)8 int thrd_sleep(const struct timespec* req, struct timespec* rem) {
9 zx_time_t deadline = ZX_TIME_INFINITE;
10 int ret = __timespec_to_deadline(req, CLOCK_REALTIME, &deadline);
11 if (ret) {
12 // According to the API, failures not due to signals should return a
13 // negative value other than -1. So return -2 if we didn't timeout.
14 return ret == ETIMEDOUT ? 0 : -2;
15 }
16
17 // For now, Zircon only provides an uninterruptible nanosleep. If
18 // we ever introduce an asynchronous mechanism that would require
19 // some EINTR-like logic, then we will also want a nanosleep call
20 // which reports back how much time is remaining. Until then,
21 // always report back 0 timeout remaining.
22
23 ret = _zx_nanosleep(deadline);
24 assert(ret == 0);
25 if (rem) {
26 *rem = (struct timespec){
27 .tv_sec = 0,
28 .tv_nsec = 0,
29 };
30 }
31 return 0;
32 }
33