X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fsignal%2Fsigtimedwait.c;h=1287174ebafdf6114c60f1d703745e703cf28a1e;hb=0847902ab99065a48f9bd3729b6e676288dfd69e;hp=a0edaaf353a94aee7d5da4d44f12827bb454aa12;hpb=685e40bb09f5f24a2af54ea09c97328808f76990;p=musl diff --git a/src/signal/sigtimedwait.c b/src/signal/sigtimedwait.c index a0edaaf3..1287174e 100644 --- a/src/signal/sigtimedwait.c +++ b/src/signal/sigtimedwait.c @@ -1,15 +1,32 @@ #include #include #include "syscall.h" -#include "libc.h" -int sigtimedwait(const sigset_t *mask, siginfo_t *si, const struct timespec *timeout) +#define IS32BIT(x) !((x)+0x80000000ULL>>32) +#define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63)) + +static int do_sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict ts) +{ +#ifdef SYS_rt_sigtimedwait_time64 + time_t s = ts ? ts->tv_sec : 0; + long ns = ts ? ts->tv_nsec : 0; + int r = -ENOSYS; + if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || !IS32BIT(s)) + r = __syscall_cp(SYS_rt_sigtimedwait_time64, mask, si, + ts ? ((long long[]){s, ns}) : 0, _NSIG/8); + if (SYS_rt_sigtimedwait == SYS_rt_sigtimedwait_time64 || r!=-ENOSYS) + return r; + return __syscall_cp(SYS_rt_sigtimedwait, mask, si, + ts ? ((long[]){CLAMP(s), ns}) : 0, _NSIG/8);; +#else + return __syscall_cp(SYS_rt_sigtimedwait, mask, si, ts, _NSIG/8); +#endif +} + +int sigtimedwait(const sigset_t *restrict mask, siginfo_t *restrict si, const struct timespec *restrict timeout) { int ret; - CANCELPT_BEGIN; - do { - ret = syscall(__NR_rt_sigtimedwait, mask, si, timeout, 8); - } while (ret<0 && errno==EINTR); - CANCELPT_END; - return ret; + do ret = do_sigtimedwait(mask, si, timeout); + while (ret==-EINTR); + return __syscall_ret(ret); }