diff options
| author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-08-24 02:58:45 +0000 |
|---|---|---|
| committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2006-08-24 02:58:45 +0000 |
| commit | 01f422c12f5799a44832eb26967a906edfc2ba55 (patch) | |
| tree | 1e8bdcaab1f4da088cc1c490bf96c361a663e0c4 /libc/sysdeps/linux/common/sigsuspend.c | |
| parent | d2db9bdb4c79afcd4b09353346cd4eaf63b6cd2c (diff) | |
| download | uClibc-alpine-01f422c12f5799a44832eb26967a906edfc2ba55.tar.bz2 uClibc-alpine-01f422c12f5799a44832eb26967a906edfc2ba55.tar.xz | |
Well, this is everything for my NPTL implementation. The 'uClibc-nptl' branch is now the exact code that I have. I am going to re-run tests now to verify everything one more time. The next step after that is to merge from trunk with the latest stuff from Mike and Peter.
Diffstat (limited to 'libc/sysdeps/linux/common/sigsuspend.c')
| -rw-r--r-- | libc/sysdeps/linux/common/sigsuspend.c | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/libc/sysdeps/linux/common/sigsuspend.c b/libc/sysdeps/linux/common/sigsuspend.c index be69c62c2..0e0df6c61 100644 --- a/libc/sysdeps/linux/common/sigsuspend.c +++ b/libc/sysdeps/linux/common/sigsuspend.c @@ -2,31 +2,56 @@ /* * sigsuspend() for uClibc * + * Copyright (C) 2006 by Steven J. Hill <sjhill@realitydiluted.com> * Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org> * - * GNU Library General Public License (LGPL) version 2 or later. + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ #include "syscalls.h" #include <signal.h> #undef sigsuspend +libc_hidden_proto(sigsuspend) + #ifdef __NR_rt_sigsuspend -#define __NR___rt_sigsuspend __NR_rt_sigsuspend +# define __NR___rt_sigsuspend __NR_rt_sigsuspend + +# ifdef __UCLIBC_HAS_THREADS_NATIVE__ +# include <errno.h> +# include <sysdep-cancel.h> + +/* Change the set of blocked signals to SET, + wait until a signal arrives, and restore the set of blocked signals. */ +int sigsuspend (const sigset_t *set) +{ + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8); + + int oldtype = LIBC_CANCEL_ASYNC (); + + int result = INLINE_SYSCALL (rt_sigsuspend, 2, set, _NSIG / 8); + + LIBC_CANCEL_RESET (oldtype); + + return result; +} +# else static inline _syscall2(int, __rt_sigsuspend, const sigset_t *, mask, size_t, size); -int attribute_hidden __sigsuspend(const sigset_t * mask) +int sigsuspend(const sigset_t * mask) { return __rt_sigsuspend(mask, _NSIG / 8); } +# endif #else -#define __NR___syscall_sigsuspend __NR_sigsuspend +# define __NR___syscall_sigsuspend __NR_sigsuspend static inline _syscall3(int, __syscall_sigsuspend, int, a, unsigned long int, b, unsigned long int, c); -int attribute_hidden __sigsuspend(const sigset_t * set) +int sigsuspend(const sigset_t * set) { return __syscall_sigsuspend(0, 0, set->__val[0]); } #endif -strong_alias(__sigsuspend,sigsuspend) +libc_hidden_def(sigsuspend) |
