don't fail with EINTR in sigtimedwait
authorRich Felker <dalias@aerifal.cx>
Thu, 10 Mar 2011 15:43:09 +0000 (10:43 -0500)
committerRich Felker <dalias@aerifal.cx>
Thu, 10 Mar 2011 15:43:09 +0000 (10:43 -0500)
POSIX allows either behavior, but sigwait is not allowed to fail with
EINTR, so the retry loop would have to be in one or the other anyway.

src/signal/sigtimedwait.c

index 155185de8ab79a99dd05ba4dc402c1d4087da6fd..0a7c5eacdf1c3574c7f17d9a5155a591db8473ca 100644 (file)
@@ -1,12 +1,12 @@
 #include <signal.h>
+#include <errno.h>
 #include "syscall.h"
 
 int sigtimedwait(const sigset_t *mask, siginfo_t *si, const struct timespec *timeout)
 {
-       long k_timeout[2];
-       if (timeout) {
-               k_timeout[0] = timeout->tv_sec;
-               k_timeout[1] = timeout->tv_nsec;
-       }
-       return syscall4(__NR_rt_sigtimedwait, (long)mask, (long)si, timeout ? (long)k_timeout : 0, SYSCALL_SIGSET_SIZE);
+       int ret;
+       do {
+               ret = syscall4(__NR_rt_sigtimedwait, (long)mask, (long)si, (long)timeout, SYSCALL_SIGSET_SIZE);
+       } while (ret<0 && errno==EINTR);
+       return ret;
 }