mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08: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:
parent
e2b9d562d1
commit
a50efac19a
@ -29,6 +29,7 @@ libc {
|
||||
GLIBC_PRIVATE {
|
||||
__libc_alloca_cutoff;
|
||||
__libc_pthread_init;
|
||||
__pthread_cleanup_stack;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <pthread-functions.h>
|
||||
#include <libc-lock.h>
|
||||
#include <fork.h>
|
||||
#include <pt-internal.h>
|
||||
|
||||
/* 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);
|
||||
|
@ -19,6 +19,8 @@
|
||||
#include <string.h>
|
||||
#include <pthread-functions.h>
|
||||
|
||||
__thread struct __pthread_cancelation_handler *__pthread_cleanup_stack;
|
||||
|
||||
void
|
||||
__libc_pthread_init (const struct pthread_functions *functions)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user