mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
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:
parent
6d1d603417
commit
d482ebfa67
@ -46,6 +46,8 @@ unsigned int __pthread_total;
|
||||
static void
|
||||
entry_point (struct __pthread *self, void *(*start_routine) (void *), void *arg)
|
||||
{
|
||||
int err;
|
||||
|
||||
___pthread_self = self;
|
||||
__resp = &self->res_state;
|
||||
|
||||
@ -60,6 +62,10 @@ entry_point (struct __pthread *self, void *(*start_routine) (void *), void *arg)
|
||||
|
||||
__pthread_startup ();
|
||||
|
||||
/* We can now unleash signals. */
|
||||
err = __pthread_sigstate (self, SIG_SETMASK, &self->init_sigset, 0, 0);
|
||||
assert_perror (err);
|
||||
|
||||
if (self->c11)
|
||||
{
|
||||
/* 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
|
||||
just inherit the process' sigmask. */
|
||||
if (__pthread_num_threads == 1)
|
||||
err = __sigprocmask (0, 0, &sigset);
|
||||
err = __sigprocmask (0, 0, &pthread->init_sigset);
|
||||
else
|
||||
err = __pthread_sigstate (_pthread_self (), 0, 0, &sigset, 0);
|
||||
err = __pthread_sigstate (_pthread_self (), 0, 0, &pthread->init_sigset, 0);
|
||||
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);
|
||||
assert_perror (err);
|
||||
|
||||
|
@ -102,6 +102,9 @@ struct __pthread
|
||||
/* Indicates whether is a C11 thread created by thrd_creat. */
|
||||
bool c11;
|
||||
|
||||
/* Initial sigset for the thread. */
|
||||
sigset_t init_sigset;
|
||||
|
||||
/* Thread context. */
|
||||
struct pthread_mcontext mcontext;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user