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.
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index 6e49acd..6c841be 100644
--- a/src/thread/pthread_create.c
+++ b/src/thread/pthread_create.c
@@ -35,7 +35,7 @@
* 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 @@
* 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 @@
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 @@
}
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 @@
__release_ptc();
if (do_sched) {
- __syscall(SYS_rt_sigprocmask, SIG_SETMASK,
- new->sigmask, 0, _NSIG/8);
+ __restore_sigs(new->sigmask);
}
if (ret < 0) {