summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-08-12 01:11:28 -0400
committerRich Felker <dalias@aerifal.cx>2011-08-12 01:11:28 -0400
commitb1a7102d832220066e7352f40e5744da932f5a28 (patch)
tree8e41d1c191401a4309fb0fcf80af9293347b0079 /src
parent8b625e45ff27ae6604ced1039d6c28293b60380a (diff)
downloadmusl-b1a7102d832220066e7352f40e5744da932f5a28.tar.gz
more efficient signal blocking for timer threads
due to the barrier, it's safe just to block signals in the new thread, rather than blocking and unblocking in the parent thread.
Diffstat (limited to 'src')
-rw-r--r--src/time/timer_create.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/time/timer_create.c b/src/time/timer_create.c
index f596b0fe..6cff16fb 100644
--- a/src/time/timer_create.c
+++ b/src/time/timer_create.c
@@ -58,6 +58,7 @@ static void *start(void *arg)
{
pthread_t self = __pthread_self();
struct start_args *args = arg;
+ sigset_t set;
/* Reuse no-longer-needed thread structure fields to avoid
* needing the timer address in the signal handler. */
@@ -65,6 +66,9 @@ static void *start(void *arg)
self->start_arg = args->sev->sigev_value.sival_ptr;
self->result = (void *)-1;
+ sigfillset(&set);
+ pthread_sigmask(SIG_BLOCK, &set, 0);
+
pthread_barrier_wait(&args->b);
__wait(&self->delete_timer, 0, 0, 1);
__syscall(SYS_timer_delete, self->result);
@@ -80,7 +84,6 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
struct start_args args;
struct ksigevent ksev, *ksevp=0;
int timerid;
- sigset_t set;
switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
case SIGEV_NONE:
@@ -105,10 +108,7 @@ int timer_create(clockid_t clk, struct sigevent *evp, timer_t *res)
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_barrier_init(&args.b, 0, 2);
args.sev = evp;
- sigfillset(&set);
- pthread_sigmask(SIG_BLOCK, &set, &set);
r = pthread_create(&td, &attr, start, &args);
- pthread_sigmask(SIG_SETMASK, &set, 0);
if (r) {
errno = r;
return -1;