3 #include "pthread_impl.h"
5 #define IS32BIT(x) !((x)+0x80000000ULL>>32)
7 int timer_settime(timer_t t
, int flags
, const struct itimerspec
*restrict val
, struct itimerspec
*restrict old
)
10 pthread_t td
= (void *)((uintptr_t)t
<< 1);
11 t
= (void *)(uintptr_t)(td
->timer_id
& INT_MAX
);
13 #ifdef SYS_timer_settime64
14 time_t is
= val
->it_interval
.tv_sec
, vs
= val
->it_value
.tv_sec
;
15 long ins
= val
->it_interval
.tv_nsec
, vns
= val
->it_value
.tv_nsec
;
17 if (SYS_timer_settime
== SYS_timer_settime64
18 || !IS32BIT(is
) || !IS32BIT(vs
) || (sizeof(time_t)>4 && old
))
19 r
= __syscall(SYS_timer_settime64
, t
, flags
,
20 ((long long[]){is
, ins
, vs
, vns
}), old
);
21 if (SYS_timer_settime
== SYS_timer_settime64
|| r
!=-ENOSYS
)
22 return __syscall_ret(r
);
23 if (!IS32BIT(is
) || !IS32BIT(vs
))
24 return __syscall_ret(-ENOTSUP
);
26 r
= __syscall(SYS_timer_settime
, t
, flags
,
27 ((long[]){is
, ins
, vs
, vns
}), old32
);
29 old
->it_interval
.tv_sec
= old32
[0];
30 old
->it_interval
.tv_nsec
= old32
[1];
31 old
->it_value
.tv_sec
= old32
[2];
32 old
->it_value
.tv_nsec
= old32
[3];
34 return __syscall_ret(r
);
36 return syscall(SYS_timer_settime
, t
, flags
, val
, old
);