From b72b0b14d0da0b506fbddf755cc8c7d0cd813287 Mon Sep 17 00:00:00 2001 From: "Peter S. Mazinger" Date: Fri, 22 Apr 2011 00:33:48 +0200 Subject: rework cancellation for sigwait, sigtimedwait and sigwaitinfo sigtimedwait: - provide __sigtimedwait_nocancel - use __SYSCALL_SIGSET_T_SIZE instead of _NSIG / 8 - do not provide __sigtimedwait - guard a section to avoid failure on archs if SI_TKILL/SI_USER are not defined sigwaitinfo: - simply use sigtimedwait since that handles cancellation already sigwait: - use non-cancellable functions (sigtimedwait, sigsuspend) - get rid of code already done in __sigtimedwait_nocancel Signed-off-by: Peter S. Mazinger Signed-off-by: Bernhard Reutner-Fischer --- libc/sysdeps/linux/common/__rt_sigtimedwait.c | 75 ++++++++++----------------- 1 file changed, 28 insertions(+), 47 deletions(-) (limited to 'libc/sysdeps/linux/common/__rt_sigtimedwait.c') diff --git a/libc/sysdeps/linux/common/__rt_sigtimedwait.c b/libc/sysdeps/linux/common/__rt_sigtimedwait.c index 168e38071..962ccb04b 100644 --- a/libc/sysdeps/linux/common/__rt_sigtimedwait.c +++ b/libc/sysdeps/linux/common/__rt_sigtimedwait.c @@ -9,41 +9,46 @@ */ #include -#include -#include #ifdef __NR_rt_sigtimedwait +# include +# include +# ifdef SIGCANCEL /* defined only in NPTL's pthreadP.h */ +# define __need_NULL +# include +# include +# endif -# ifdef __UCLIBC_HAS_THREADS_NATIVE__ -# include - -static int do_sigtimedwait(const sigset_t *set, siginfo_t *info, - const struct timespec *timeout) +int __NC(sigtimedwait)(const sigset_t *set, siginfo_t *info, + const struct timespec *timeout) { -# ifdef SIGCANCEL +# ifdef SIGCANCEL sigset_t tmpset; if (set != NULL && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) -# ifdef SIGSETXID +# ifdef SIGSETXID || __builtin_expect (__sigismember (set, SIGSETXID), 0) -# endif +# 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 +# ifdef SIGSETXID __sigdelset (&tmpset, SIGSETXID); -# endif +# endif set = &tmpset; } -# endif +# endif +/* if this is enabled, enable the disabled section in sigwait.c */ +# if defined SI_TKILL && defined SI_USER /* XXX The size argument hopefully will have to be changed to the real size of the user-level sigset_t. */ - int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set, info, - timeout, _NSIG / 8); + /* on uClibc we use the kernel sigset_t size */ + int result = INLINE_SYSCALL(rt_sigtimedwait, 4, set, info, + timeout, __SYSCALL_SIGSET_T_SIZE); /* The kernel generates a SI_TKILL code in si_code in case tkill is used. tkill is transparently used in raise(). Since having @@ -53,38 +58,14 @@ static int do_sigtimedwait(const sigset_t *set, siginfo_t *info, info->si_code = SI_USER; return result; -} - -/* Return any pending signal or wait for one for the given time. */ -int __sigtimedwait(const sigset_t *set, siginfo_t *info, - const struct timespec *timeout) -{ - if(SINGLE_THREAD_P) - return do_sigtimedwait(set, info, timeout); - - int oldtype = LIBC_CANCEL_ASYNC(); - - /* XXX The size argument hopefully will have to be changed to the - real size of the user-level sigset_t. */ - int result = do_sigtimedwait(set, info, timeout); - - LIBC_CANCEL_RESET(oldtype); - - return result; -} # else -# define __need_NULL -# include -# define __NR___rt_sigtimedwait __NR_rt_sigtimedwait -static _syscall4(int, __rt_sigtimedwait, const sigset_t *, set, - siginfo_t *, info, const struct timespec *, timeout, - size_t, setsize); - -int __sigtimedwait(const sigset_t * set, siginfo_t * info, - const struct timespec *timeout) -{ - return __rt_sigtimedwait(set, info, timeout, _NSIG / 8); + /* on uClibc we use the kernel sigset_t size */ + return INLINE_SYSCALL(rt_sigtimedwait, 4, set, info, + timeout, __SYSCALL_SIGSET_T_SIZE); +# endif } -# endif /* !__UCLIBC_HAS_THREADS_NATIVE__ */ -weak_alias(__sigtimedwait,sigtimedwait) +CANCELLABLE_SYSCALL(int, sigtimedwait, + (const sigset_t *set, siginfo_t *info, const struct timespec *timeout), + (set, info, timeout)) +lt_libc_hidden(sigtimedwait) #endif -- cgit v1.2.3