1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| | #include "pthread_impl.h"
#include <threads.h>
int __clock_gettime(clockid_t clk, struct timespec *ts);
int __thrd_wait(volatile int *addr, int val, const struct timespec *at)
{
int r;
struct timespec to, *top=0;
if (at) {
if (at->tv_nsec >= 1000000000UL) return EINVAL;
if (__clock_gettime(CLOCK_REALTIME, &to)) return EINVAL;
to.tv_sec = at->tv_sec - to.tv_sec;
if ((to.tv_nsec = at->tv_nsec - to.tv_nsec) < 0) {
to.tv_sec--;
to.tv_nsec += 1000000000;
}
if (to.tv_sec < 0) return ETIMEDOUT;
top = &to;
}
r = -__syscall_cp(SYS_futex, addr, FUTEX_WAIT|THRD_PRIVATE, val, top);
if (r == EINTR || r == EINVAL || r == ETIMEDOUT || r == EWOULDBLOCK) return r;
return 0;
}
|