drop use of pthread_once in timer_create

this makes the code slightly smaller and eliminates timer_create from
relevance to possible future changes to multithreaded fork.

the barrier of a_store isn't technically needed here, but a_store is
used anyway for internal consistency of the memory model.
This commit is contained in:
Rich Felker 2020-10-14 19:07:27 -04:00
parent 6ae2568bc2
commit 85e16aec51

View file

@ -2,6 +2,7 @@
#include <setjmp.h> #include <setjmp.h>
#include <limits.h> #include <limits.h>
#include "pthread_impl.h" #include "pthread_impl.h"
#include "atomic.h"
struct ksigevent { struct ksigevent {
union sigval sigev_value; union sigval sigev_value;
@ -32,14 +33,6 @@ static void cleanup_fromsig(void *p)
longjmp(p, 1); longjmp(p, 1);
} }
static void install_handler()
{
struct sigaction sa = {
.sa_handler = SIG_DFL,
};
__libc_sigaction(SIGTIMER, &sa, 0);
}
static void *start(void *arg) static void *start(void *arg)
{ {
pthread_t self = __pthread_self(); pthread_t self = __pthread_self();
@ -66,7 +59,7 @@ static void *start(void *arg)
int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict res) int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict res)
{ {
static pthread_once_t once = PTHREAD_ONCE_INIT; volatile static int init = 0;
pthread_t td; pthread_t td;
pthread_attr_t attr; pthread_attr_t attr;
int r; int r;
@ -90,7 +83,11 @@ int timer_create(clockid_t clk, struct sigevent *restrict evp, timer_t *restrict
*res = (void *)(intptr_t)timerid; *res = (void *)(intptr_t)timerid;
break; break;
case SIGEV_THREAD: case SIGEV_THREAD:
pthread_once(&once, install_handler); if (!init) {
struct sigaction sa = { .sa_handler = SIG_DFL };
__libc_sigaction(SIGTIMER, &sa, 0);
a_store(&init, 1);
}
if (evp->sigev_notify_attributes) if (evp->sigev_notify_attributes)
attr = *evp->sigev_notify_attributes; attr = *evp->sigev_notify_attributes;
else else