1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00

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 <pt-internal.h>.
(dummy_list): Remove variable.
(__pthread_get_cleanup_stack): Return the address of __pthread_cleanup_stack
instead of that of dummy_list.
This commit is contained in:
Samuel Thibault
2020-06-14 12:56:54 +00:00
parent e2b9d562d1
commit a50efac19a
6 changed files with 9 additions and 6 deletions

View File

@ -29,6 +29,7 @@ libc {
GLIBC_PRIVATE { GLIBC_PRIVATE {
__libc_alloca_cutoff; __libc_alloca_cutoff;
__libc_pthread_init; __libc_pthread_init;
__pthread_cleanup_stack;
} }
} }

View File

@ -23,6 +23,7 @@
#include <pthread-functions.h> #include <pthread-functions.h>
#include <libc-lock.h> #include <libc-lock.h>
#include <fork.h> #include <fork.h>
#include <pt-internal.h>
/* Pointers to the libc functions. */ /* Pointers to the libc functions. */
struct pthread_functions __libc_pthread_functions attribute_hidden; 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) 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 **, FORWARD2 (__pthread_get_cleanup_stack, struct __pthread_cancelation_handler **,
(void), (), return &dummy_list); (void), (), return &__pthread_cleanup_stack);

View File

@ -19,6 +19,8 @@
#include <string.h> #include <string.h>
#include <pthread-functions.h> #include <pthread-functions.h>
__thread struct __pthread_cancelation_handler *__pthread_cleanup_stack;
void void
__libc_pthread_init (const struct pthread_functions *functions) __libc_pthread_init (const struct pthread_functions *functions)
{ {

View File

@ -65,8 +65,6 @@ initialize_pthread (struct __pthread *new)
new->state_lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER; new->state_lock = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
new->state_cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER; new->state_cond = (pthread_cond_t) PTHREAD_COND_INITIALIZER;
new->cancelation_handlers = 0;
memset (&new->res_state, '\0', sizeof (new->res_state)); memset (&new->res_state, '\0', sizeof (new->res_state));
new->tcb = NULL; new->tcb = NULL;

View File

@ -23,6 +23,6 @@
struct __pthread_cancelation_handler ** struct __pthread_cancelation_handler **
__pthread_get_cleanup_stack (void) __pthread_get_cleanup_stack (void)
{ {
return &_pthread_self ()->cancelation_handlers; return &__pthread_cleanup_stack;
} }
hidden_def(__pthread_get_cleanup_stack) hidden_def(__pthread_get_cleanup_stack)

View File

@ -81,7 +81,6 @@ struct __pthread
int cancel_state; int cancel_state;
int cancel_type; int cancel_type;
int cancel_pending; int cancel_pending;
struct __pthread_cancelation_handler *cancelation_handlers;
/* Thread stack. */ /* Thread stack. */
void *stackaddr; void *stackaddr;
@ -197,6 +196,9 @@ extern pthread_rwlock_t __pthread_threads_lock;
#ifndef _pthread_self #ifndef _pthread_self
extern struct __pthread *_pthread_self (void); extern struct __pthread *_pthread_self (void);
#endif #endif
/* Stores the stack of cleanup handlers for the thread. */
extern __thread struct __pthread_cancelation_handler *__pthread_cleanup_stack;
/* Initialize the pthreads library. */ /* Initialize the pthreads library. */