mirror of
git://git.musl-libc.org/musl
synced 2025-03-06 19:57:37 +00:00
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.
This commit is contained in:
parent
8b625e45ff
commit
b1a7102d83
@ -58,6 +58,7 @@ static void *start(void *arg)
|
|||||||
{
|
{
|
||||||
pthread_t self = __pthread_self();
|
pthread_t self = __pthread_self();
|
||||||
struct start_args *args = arg;
|
struct start_args *args = arg;
|
||||||
|
sigset_t set;
|
||||||
|
|
||||||
/* Reuse no-longer-needed thread structure fields to avoid
|
/* Reuse no-longer-needed thread structure fields to avoid
|
||||||
* needing the timer address in the signal handler. */
|
* 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->start_arg = args->sev->sigev_value.sival_ptr;
|
||||||
self->result = (void *)-1;
|
self->result = (void *)-1;
|
||||||
|
|
||||||
|
sigfillset(&set);
|
||||||
|
pthread_sigmask(SIG_BLOCK, &set, 0);
|
||||||
|
|
||||||
pthread_barrier_wait(&args->b);
|
pthread_barrier_wait(&args->b);
|
||||||
__wait(&self->delete_timer, 0, 0, 1);
|
__wait(&self->delete_timer, 0, 0, 1);
|
||||||
__syscall(SYS_timer_delete, self->result);
|
__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 start_args args;
|
||||||
struct ksigevent ksev, *ksevp=0;
|
struct ksigevent ksev, *ksevp=0;
|
||||||
int timerid;
|
int timerid;
|
||||||
sigset_t set;
|
|
||||||
|
|
||||||
switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
|
switch (evp ? evp->sigev_notify : SIGEV_SIGNAL) {
|
||||||
case SIGEV_NONE:
|
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_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||||
pthread_barrier_init(&args.b, 0, 2);
|
pthread_barrier_init(&args.b, 0, 2);
|
||||||
args.sev = evp;
|
args.sev = evp;
|
||||||
sigfillset(&set);
|
|
||||||
pthread_sigmask(SIG_BLOCK, &set, &set);
|
|
||||||
r = pthread_create(&td, &attr, start, &args);
|
r = pthread_create(&td, &attr, start, &args);
|
||||||
pthread_sigmask(SIG_SETMASK, &set, 0);
|
|
||||||
if (r) {
|
if (r) {
|
||||||
errno = r;
|
errno = r;
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
Reference in New Issue
Block a user