htl: Keep thread signals blocked during its initialization

One may send signals immediately after creating a thread. We need to block them
until the thread is ready to run signal handlers.
This commit is contained in:
Samuel Thibault 2020-11-11 12:49:10 +00:00
parent 6d1d603417
commit d482ebfa67
2 changed files with 13 additions and 2 deletions

View File

@ -46,6 +46,8 @@ unsigned int __pthread_total;
static void static void
entry_point (struct __pthread *self, void *(*start_routine) (void *), void *arg) entry_point (struct __pthread *self, void *(*start_routine) (void *), void *arg)
{ {
int err;
___pthread_self = self; ___pthread_self = self;
__resp = &self->res_state; __resp = &self->res_state;
@ -60,6 +62,10 @@ entry_point (struct __pthread *self, void *(*start_routine) (void *), void *arg)
__pthread_startup (); __pthread_startup ();
/* We can now unleash signals. */
err = __pthread_sigstate (self, SIG_SETMASK, &self->init_sigset, 0, 0);
assert_perror (err);
if (self->c11) if (self->c11)
{ {
/* The function pointer of the c11 thread start is cast to an incorrect /* The function pointer of the c11 thread start is cast to an incorrect
@ -201,11 +207,13 @@ __pthread_create_internal (struct __pthread **thread,
shall be empty." If the currnet thread is not a pthread then we shall be empty." If the currnet thread is not a pthread then we
just inherit the process' sigmask. */ just inherit the process' sigmask. */
if (__pthread_num_threads == 1) if (__pthread_num_threads == 1)
err = __sigprocmask (0, 0, &sigset); err = __sigprocmask (0, 0, &pthread->init_sigset);
else else
err = __pthread_sigstate (_pthread_self (), 0, 0, &sigset, 0); err = __pthread_sigstate (_pthread_self (), 0, 0, &pthread->init_sigset, 0);
assert_perror (err); assert_perror (err);
/* But block the signals for now, until the thread is fully initialized. */
__sigfillset (&sigset);
err = __pthread_sigstate (pthread, SIG_SETMASK, &sigset, 0, 1); err = __pthread_sigstate (pthread, SIG_SETMASK, &sigset, 0, 1);
assert_perror (err); assert_perror (err);

View File

@ -102,6 +102,9 @@ struct __pthread
/* Indicates whether is a C11 thread created by thrd_creat. */ /* Indicates whether is a C11 thread created by thrd_creat. */
bool c11; bool c11;
/* Initial sigset for the thread. */
sigset_t init_sigset;
/* Thread context. */ /* Thread context. */
struct pthread_mcontext mcontext; struct pthread_mcontext mcontext;