summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-04-26 19:48:01 -0400
committerRich Felker <dalias@aerifal.cx>2013-04-26 19:48:01 -0400
commit2c074b0d6cb2b28c5d1c0ccb2809965f4676efeb (patch)
tree9c56db36bf3ae26450e8374bb38f181b787ae707 /src/thread
parentd53c92c972dab717f8f8e521eb0e9c4404cef4bd (diff)
downloadmusl-2c074b0d6cb2b28c5d1c0ccb2809965f4676efeb.tar.gz
transition to using functions for internal signal blocking/restoring
there are several reasons for this change. one is getting rid of the repetition of the syscall signature all over the place. another is sharing the constant masks without costly GOT accesses in PIC. the main motivation, however, is accurately representing whether we want to block signals that might be handled by the application, or all signals.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/pthread_create.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index 6e49acdc..6c841be7 100644
--- a/src/thread/pthread_create.c
+++ b/src/thread/pthread_create.c
@@ -35,7 +35,7 @@ _Noreturn void pthread_exit(void *result)
* This is important to ensure that dynamically allocated TLS
* is not under-allocated/over-committed, and possibly for other
* reasons as well. */
- __syscall(SYS_rt_sigprocmask, SIG_BLOCK, SIGALL_SET, &set, _NSIG/8);
+ __block_all_sigs(&set);
/* Wait to unlock the kill lock, which governs functions like
* pthread_kill which target a thread id, until signals have
@@ -51,7 +51,7 @@ _Noreturn void pthread_exit(void *result)
* stdio cleanup code a consistent state. */
if (a_fetch_add(&libc.threads_minus_1, -1)==0) {
libc.threads_minus_1 = 0;
- __syscall(SYS_rt_sigprocmask, SIG_SETMASK, &set, 0, _NSIG/8);
+ __restore_sigs(&set);
exit(0);
}
@@ -94,8 +94,7 @@ static int start(void *p)
self->detached = 2;
pthread_exit(0);
}
- __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
- self->sigmask, 0, _NSIG/8);
+ __restore_sigs(self->sigmask);
}
if (self->unblock_cancel)
__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
@@ -202,8 +201,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
}
if (attr._a_sched) {
do_sched = new->startlock[0] = 1;
- __syscall(SYS_rt_sigprocmask, SIG_BLOCK,
- SIGALL_SET, new->sigmask, _NSIG/8);
+ __block_app_sigs(new->sigmask);
}
new->unblock_cancel = self->cancel;
new->canary = self->canary;
@@ -214,8 +212,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
__release_ptc();
if (do_sched) {
- __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
- new->sigmask, 0, _NSIG/8);
+ __restore_sigs(new->sigmask);
}
if (ret < 0) {