summaryrefslogtreecommitdiffstats
path: root/libc/signal/sigwait.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/signal/sigwait.c')
-rw-r--r--libc/signal/sigwait.c86
1 files changed, 6 insertions, 80 deletions
diff --git a/libc/signal/sigwait.c b/libc/signal/sigwait.c
index c8a93dfb2..8ff2541a0 100644
--- a/libc/signal/sigwait.c
+++ b/libc/signal/sigwait.c
@@ -1,8 +1,7 @@
/* vi: set sw=4 ts=4: */
/* sigwait
*
- * Copyright (C) 2006 by Steven J. Hill <sjhill@realitydiluted.com>
- * Copyright (C) 2003-2005 by Erik Andersen <andersen@uclibc.org>
+ * Copyright (C) 2003 by Erik Andersen <andersen@uclibc.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,89 +18,15 @@
* Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA. */
-#define sigwaitinfo __sigwaitinfo
-
#include <errno.h>
#include <signal.h>
#include <string.h>
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
-# include <sysdep-cancel.h>
-
-# ifdef __NR_rt_sigtimedwait
-
-/* Return any pending signal or wait for one for the given time. */
-static int do_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.
-# ifdef IS_IN_libc
- __memcpy(&tmpset, set, _NSIG / 8);
-# else
- memcpy(&tmpset, set, _NSIG / 8);
-# endif
- __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. */
-# ifdef INTERNAL_SYSCALL
- 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))
- {
- *sig = ret;
- ret = 0;
- }
-else
- ret = INTERNAL_SYSCALL_ERRNO (ret, err);
-# else
-# error INTERNAL_SYSCALL must be defined!!!
-# endif
-
- return ret;
-}
+libc_hidden_proto(sigwaitinfo)
+int __sigwait (const sigset_t *set, int *sig) attribute_hidden;
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
-# error We must have rt_sigtimedwait defined!!!
-# endif
-#else
-# undef sigwait
-int attribute_hidden __sigwait (const sigset_t *set, int *sig)
-{
int ret = 1;
if ((ret = sigwaitinfo(set, NULL)) != -1) {
*sig = ret;
@@ -109,5 +34,6 @@ int attribute_hidden __sigwait (const sigset_t *set, int *sig)
}
return 1;
}
-#endif
-weak_alias(__sigwait, sigwait)
+libc_hidden_proto(sigwait)
+weak_alias(__sigwait,sigwait)
+libc_hidden_def(sigwait)