From: Samuel Thibault Date: Sun, 14 Jun 2020 12:56:54 +0000 (+0000) Subject: htl: Move cleanup stack to variable shared between libc and pthread X-Git-Tag: glibc-2.32~223 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a50efac19a1eb0a9dc6f5917ae299c0fbbf3c46b;p=thirdparty%2Fglibc.git htl: Move cleanup stack to variable shared between libc and pthread If libpthread gets loaded dynamically, the stack needs to already contain the cleanup handlers of the main thread. * htl/libc_pthread_init.c (__pthread_cleanup_stack): New per-thread variable. * htl/Versions (libc): Add __pthread_cleanup_stack as private symbol. * htl/pt-internal.h (struct __pthread): Remove cancelation_handlers field. (__pthread_cleanup_stack): Add variable declaration. * htl/pt-alloc.c (initialize_pthread): Remove initialization of cancelation_handlers field. * htl/pt-cleanup.c (__pthread_get_cleanup_stack): Return the address of __pthread_cleanup_stack instead of that of the cancelation_handlers field. * htl/forward.c: Include . (dummy_list): Remove variable. (__pthread_get_cleanup_stack): Return the address of __pthread_cleanup_stack instead of that of dummy_list. --- diff --git a/htl/Versions b/htl/Versions index fd9eefbaee6..832cc5d814b 100644 --- a/htl/Versions +++ b/htl/Versions @@ -29,6 +29,7 @@ libc { GLIBC_PRIVATE { __libc_alloca_cutoff; __libc_pthread_init; + __pthread_cleanup_stack; } } diff --git a/htl/forward.c b/htl/forward.c index dfb7b79327f..544e7da058c 100644 --- a/htl/forward.c +++ b/htl/forward.c @@ -23,6 +23,7 @@ #include #include #include +#include /* Pointers to the libc functions. */ struct pthread_functions __libc_pthread_functions attribute_hidden; @@ -140,6 +141,5 @@ strong_alias (__pthread_setcancelstate, pthread_setcancelstate); FORWARD (pthread_setcanceltype, (int type, int *oldtype), (type, oldtype), 0) -struct __pthread_cancelation_handler *dummy_list; FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **, - (void), (), return &dummy_list); + (void), (), return &__pthread_cleanup_stack); diff --git a/htl/libc_pthread_init.c b/htl/libc_pthread_init.c index cee92f76ee1..f617c4e0bec 100644 --- a/htl/libc_pthread_init.c +++ b/htl/libc_pthread_init.c @@ -19,6 +19,8 @@ #include #include +__thread struct __pthread_cancelation_handler *__pthread_cleanup_stack; + void __libc_pthread_init (const struct pthread_functions *functions) { diff --git a/htl/pt-alloc.c b/htl/pt-alloc.c index d4426bb2e30..bf37aca7299 100644 --- a/htl/pt-alloc.c +++ b/htl/pt-alloc.c @@ -65,8 +65,6 @@ initialize_pthread (struct __pthread *new) new->state_lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER; new->state_cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER; - new->cancelation_handlers = 0; - memset (&new->res_state, '\0', sizeof (new->res_state)); new->tcb = NULL; diff --git a/htl/pt-cleanup.c b/htl/pt-cleanup.c index a9a7c95847a..7e6149bda92 100644 --- a/htl/pt-cleanup.c +++ b/htl/pt-cleanup.c @@ -23,6 +23,6 @@ struct __pthread_cancelation_handler ** __pthread_get_cleanup_stack (void) { - return &_pthread_self ()->cancelation_handlers; + return &__pthread_cleanup_stack; } hidden_def(__pthread_get_cleanup_stack) diff --git a/htl/pt-internal.h b/htl/pt-internal.h index 918c207c3ec..e0baa6bcdad 100644 --- a/htl/pt-internal.h +++ b/htl/pt-internal.h @@ -81,7 +81,6 @@ struct __pthread int cancel_state; int cancel_type; int cancel_pending; - struct __pthread_cancelation_handler *cancelation_handlers; /* Thread stack. */ void *stackaddr; @@ -197,6 +196,9 @@ extern pthread_rwlock_t __pthread_threads_lock; #ifndef _pthread_self extern struct __pthread *_pthread_self (void); #endif + +/* Stores the stack of cleanup handlers for the thread. */ +extern __thread struct __pthread_cancelation_handler *__pthread_cleanup_stack; /* Initialize the pthreads library. */