have new timer threads unblock their own SIGTIMER
authorRich Felker <dalias@aerifal.cx>
Sat, 3 Aug 2013 21:10:42 +0000 (17:10 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 3 Aug 2013 21:10:42 +0000 (17:10 -0400)
unblocking it in the pthread_once init function is not sufficient,
since multiple threads, some of them with the signal blocked, could
already exist before this is called; timers started from such threads
would be non-functional.

src/time/timer_create.c

index ee6a9c9d15f057d12ef510201fe01f887fa4468d..b54a524ce85bb2e3ec97987bb3b017dc958d96f7 100644 (file)
@@ -55,8 +55,6 @@ static void install_handler()
                .sa_flags = SA_SIGINFO | SA_RESTART
        };
        __libc_sigaction(SIGTIMER, &sa, 0);
-       __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
-               SIGTIMER_SET, 0, _NSIG/8);
 }
 
 static void *start(void *arg)
@@ -72,6 +70,8 @@ static void *start(void *arg)
 
        pthread_barrier_wait(&args->b);
        if ((id = self->timer_id) >= 0) {
+               __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
+                       SIGTIMER_SET, 0, _NSIG/8);
                __wait(&self->timer_id, 0, id, 1);
                __syscall(SYS_timer_delete, id);
        }