diff options
author | Elliott Hughes <enh@google.com> | 2013-01-10 14:42:14 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2013-01-10 14:42:14 -0800 |
commit | c5d028fc913de84a781bd61084bf7ae2182fd48e (patch) | |
tree | 9086acc9c039dad30feca8a8d80ca7af04b061e1 /libc/bionic/pthread.c | |
parent | 2bbb8fac61e482dd96386620cc6f7f193e9c6840 (diff) | |
download | android_bionic-c5d028fc913de84a781bd61084bf7ae2182fd48e.tar.gz android_bionic-c5d028fc913de84a781bd61084bf7ae2182fd48e.tar.bz2 android_bionic-c5d028fc913de84a781bd61084bf7ae2182fd48e.zip |
Only have one copy of the kernel_sigset_t hack, and add more tests.
Change-Id: I377522fcba6fb4b5fd2754ab15b091014bd7c16f
Diffstat (limited to 'libc/bionic/pthread.c')
-rw-r--r-- | libc/bionic/pthread.c | 52 |
1 files changed, 0 insertions, 52 deletions
diff --git a/libc/bionic/pthread.c b/libc/bionic/pthread.c index b685f2dcd..92ee4aa76 100644 --- a/libc/bionic/pthread.c +++ b/libc/bionic/pthread.c @@ -2099,58 +2099,6 @@ int pthread_kill(pthread_t tid, int sig) return ret; } -/* Despite the fact that our kernel headers define sigset_t explicitly - * as a 32-bit integer, the kernel system call really expects a 64-bit - * bitmap for the signal set, or more exactly an array of two-32-bit - * values (see $KERNEL/arch/$ARCH/include/asm/signal.h for details). - * - * Unfortunately, we cannot fix the sigset_t definition without breaking - * the C library ABI, so perform a little runtime translation here. - */ -typedef union { - sigset_t bionic; - uint32_t kernel[2]; -} kernel_sigset_t; - -/* this is a private syscall stub */ -extern int __rt_sigprocmask(int, const kernel_sigset_t *, kernel_sigset_t *, size_t); - -int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset) -{ - /* pthread_sigmask must return the error code, but the syscall - * will set errno instead and return 0/-1 - */ - int ret, old_errno = errno; - - /* We must convert *set into a kernel_sigset_t */ - kernel_sigset_t in_set, *in_set_ptr; - kernel_sigset_t out_set; - - in_set.kernel[0] = in_set.kernel[1] = 0; - out_set.kernel[0] = out_set.kernel[1] = 0; - - /* 'in_set_ptr' is the second parameter to __rt_sigprocmask. It must be NULL - * if 'set' is NULL to ensure correct semantics (which in this case would - * be to ignore 'how' and return the current signal set into 'oset'. - */ - if (set == NULL) { - in_set_ptr = NULL; - } else { - in_set.bionic = *set; - in_set_ptr = &in_set; - } - - ret = __rt_sigprocmask(how, in_set_ptr, &out_set, sizeof(kernel_sigset_t)); - if (ret < 0) - ret = errno; - - if (oset) - *oset = out_set.bionic; - - errno = old_errno; - return ret; -} - int pthread_getcpuclockid(pthread_t tid, clockid_t *clockid) { |