|
@@ -9,41 +9,46 @@
|
|
|
*/
|
|
|
|
|
|
#include <sys/syscall.h>
|
|
|
-#include <signal.h>
|
|
|
-#include <string.h>
|
|
|
|
|
|
#ifdef __NR_rt_sigtimedwait
|
|
|
+# include <signal.h>
|
|
|
+# include <cancel.h>
|
|
|
+# ifdef SIGCANCEL
|
|
|
+# define __need_NULL
|
|
|
+# include <stddef.h>
|
|
|
+# include <string.h>
|
|
|
+# endif
|
|
|
|
|
|
-# ifdef __UCLIBC_HAS_THREADS_NATIVE__
|
|
|
-# include <sysdep-cancel.h>
|
|
|
-
|
|
|
-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
|
|
|
))
|
|
|
{
|
|
|
|
|
|
|
|
|
memcpy (&tmpset, set, _NSIG / 8);
|
|
|
__sigdelset (&tmpset, SIGCANCEL);
|
|
|
-# ifdef SIGSETXID
|
|
|
+# ifdef SIGSETXID
|
|
|
__sigdelset (&tmpset, SIGSETXID);
|
|
|
-# endif
|
|
|
+# endif
|
|
|
set = &tmpset;
|
|
|
}
|
|
|
-# endif
|
|
|
+# endif
|
|
|
|
|
|
+
|
|
|
+# if defined SI_TKILL && defined SI_USER
|
|
|
|
|
|
real size of the user-level sigset_t. */
|
|
|
- int result = INLINE_SYSCALL (rt_sigtimedwait, 4, set, info,
|
|
|
- timeout, _NSIG / 8);
|
|
|
+
|
|
|
+ int result = INLINE_SYSCALL(rt_sigtimedwait, 4, set, info,
|
|
|
+ timeout, __SYSCALL_SIGSET_T_SIZE);
|
|
|
|
|
|
|
|
|
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;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-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();
|
|
|
-
|
|
|
-
|
|
|
- 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 <stddef.h>
|
|
|
-# 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);
|
|
|
+
|
|
|
+ return INLINE_SYSCALL(rt_sigtimedwait, 4, set, info,
|
|
|
+ timeout, __SYSCALL_SIGSET_T_SIZE);
|
|
|
+# endif
|
|
|
}
|
|
|
-# endif
|
|
|
-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
|