|
@@ -21,92 +21,36 @@
|
|
|
|
|
|
#define __need_NULL
|
|
|
#include <stddef.h>
|
|
|
+#include <sys/syscall.h>
|
|
|
#include <signal.h>
|
|
|
+#include <cancel.h>
|
|
|
|
|
|
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
|
|
|
-# include <sysdep-cancel.h>
|
|
|
+#if defined __NR_rt_sigtimedwait && defined __UCLIBC_HAS_REALTIME__
|
|
|
|
|
|
-# ifdef __NR_rt_sigtimedwait
|
|
|
-# include <string.h>
|
|
|
+#include <string.h>
|
|
|
|
|
|
/* Return any pending signal or wait for one for the given time. */
|
|
|
-static int do_sigwait(const sigset_t *set, int *sig)
|
|
|
+static int __NC(sigwait)(const sigset_t *set, int *sig)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
-# ifdef SIGCANCEL
|
|
|
- sigset_t tmpset;
|
|
|
- if (set != NULL
|
|
|
- && (__builtin_expect (__sigismember (set, SIGCANCEL), 0)
|
|
|
-# ifdef SIGSETXID
|
|
|
- || __builtin_expect (__sigismember (set, SIGSETXID), 0)
|
|
|
-# endif
|
|
|
- ))
|
|
|
- {
|
|
|
- /* Create a temporary mask without the bit for SIGCANCEL set. */
|
|
|
- // We are not copying more than we have to.
|
|
|
- memcpy(&tmpset, set, _NSIG / 8);
|
|
|
- __sigdelset(&tmpset, SIGCANCEL);
|
|
|
-# ifdef SIGSETXID
|
|
|
- __sigdelset(&tmpset, SIGSETXID);
|
|
|
-# endif
|
|
|
- set = &tmpset;
|
|
|
- }
|
|
|
-# endif
|
|
|
-
|
|
|
- /* XXX The size argument hopefully will have to be changed to the
|
|
|
- real size of the user-level sigset_t. */
|
|
|
- INTERNAL_SYSCALL_DECL(err);
|
|
|
do
|
|
|
- ret = INTERNAL_SYSCALL (rt_sigtimedwait, err, 4, set, NULL,
|
|
|
- NULL, _NSIG / 8);
|
|
|
- while (INTERNAL_SYSCALL_ERROR_P (ret, err)
|
|
|
- && INTERNAL_SYSCALL_ERRNO (ret, err) == EINTR);
|
|
|
- if (! INTERNAL_SYSCALL_ERROR_P (ret, err))
|
|
|
- {
|
|
|
+ /* we might as well use sigtimedwait and do not care about cancellation */
|
|
|
+ ret = __NC(sigtimedwait)(set, NULL, NULL);
|
|
|
+ while (ret == -1 && errno == EINTR);
|
|
|
+ if (ret != -1) {
|
|
|
*sig = ret;
|
|
|
ret = 0;
|
|
|
- }
|
|
|
-else
|
|
|
- ret = INTERNAL_SYSCALL_ERRNO (ret, err);
|
|
|
+ } else
|
|
|
+ ret = errno;
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-int sigwait (const sigset_t *set, int *sig)
|
|
|
-{
|
|
|
- if(SINGLE_THREAD_P)
|
|
|
- return do_sigwait(set, sig);
|
|
|
-
|
|
|
- int oldtype = LIBC_CANCEL_ASYNC();
|
|
|
-
|
|
|
- int result = do_sigwait(set, sig);
|
|
|
-
|
|
|
- LIBC_CANCEL_RESET(oldtype);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-# else /* __NR_rt_sigtimedwait */
|
|
|
-# error We must have rt_sigtimedwait defined!!!
|
|
|
-# endif
|
|
|
-#else /* __UCLIBC_HAS_THREADS_NATIVE__ */
|
|
|
+#else /* __NR_rt_sigtimedwait */
|
|
|
|
|
|
-# if defined __UCLIBC_HAS_REALTIME__
|
|
|
-
|
|
|
-int sigwait (const sigset_t *set, int *sig)
|
|
|
-{
|
|
|
- int ret = 1;
|
|
|
- if ((ret = __sigwaitinfo(set, NULL)) != -1) {
|
|
|
- *sig = ret;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
-# else /* __UCLIBC_HAS_REALTIME__ */
|
|
|
-# include <errno.h>
|
|
|
-# include <unistd.h> /* smallint */
|
|
|
/* variant without REALTIME extensions */
|
|
|
+#include <unistd.h> /* smallint */
|
|
|
|
|
|
static smallint was_sig; /* obviously not thread-safe */
|
|
|
|
|
@@ -115,7 +59,7 @@ static void ignore_signal(int sig)
|
|
|
was_sig = sig;
|
|
|
}
|
|
|
|
|
|
-int sigwait (const sigset_t *set, int *sig)
|
|
|
+static int __NC(sigwait)(const sigset_t *set, int *sig)
|
|
|
{
|
|
|
sigset_t tmp_mask;
|
|
|
struct sigaction saved[NSIG];
|
|
@@ -149,7 +93,7 @@ int sigwait (const sigset_t *set, int *sig)
|
|
|
}
|
|
|
|
|
|
/* Now we can wait for signals. */
|
|
|
- sigsuspend (&tmp_mask);
|
|
|
+ __NC(sigsuspend)(&tmp_mask);
|
|
|
|
|
|
restore_handler:
|
|
|
save_errno = errno;
|
|
@@ -165,5 +109,6 @@ int sigwait (const sigset_t *set, int *sig)
|
|
|
*sig = was_sig;
|
|
|
return was_sig == -1 ? -1 : 0;
|
|
|
}
|
|
|
-# endif /* __UCLIBC_HAS_REALTIME__ */
|
|
|
-#endif /* __UCLIBC_HAS_THREADS_NATIVE__ */
|
|
|
+#endif /* __NR_rt_sigtimedwait */
|
|
|
+
|
|
|
+CANCELLABLE_SYSCALL(int, sigwait, (const sigset_t *set, int *sig), (set, sig))
|