Преглед на файлове

don't fail with EINTR in sigtimedwait

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.
Rich Felker преди 14 години
родител
ревизия
0a949ebdf0
променени са 1 файла, в които са добавени 6 реда и са изтрити 6 реда
  1. 6 6
      src/signal/sigtimedwait.c

+ 6 - 6
src/signal/sigtimedwait.c

@@ -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;
 }