diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-09-17 05:04:16 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-09-17 05:04:16 +0000 |
commit | a243f94e3636a48142e93dffb4f919f4595f91e8 (patch) | |
tree | 2d74b570a88632dd5426c60f21245c88f444e242 /linuxthreads/internals.h | |
parent | 65947215c78a870c9e0b0217a7bd949164e1993b (diff) | |
download | glibc-a243f94e3636a48142e93dffb4f919f4595f91e8.tar.gz glibc-a243f94e3636a48142e93dffb4f919f4595f91e8.tar.xz glibc-a243f94e3636a48142e93dffb4f919f4595f91e8.zip |
Update.
2003-09-17 Jakub Jelinek <jakub@redhat.com> * pthread.c (manager_thread): Remove static, add attribute_hidden. (thread_self_stack): Rename to... (__pthread_self_stack): ... this. Remove static. (pthread_handle_sigcancel): Use check_thread_self (). (pthread_handle_sigrestart): Likewise. * sighandler.c (__pthread_sighandler, __pthread_sighandler_rt): Likewise. * descr.h (manager_thread): Declare. * internals.h (__pthread_self_stack): New prototype. (__manager_thread): Define. (check_thread_self): New function.
Diffstat (limited to 'linuxthreads/internals.h')
-rw-r--r-- | linuxthreads/internals.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index a5ec8b9284..90649335bb 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -363,6 +363,7 @@ extern int __pthread_condattr_init (pthread_condattr_t *attr); extern int __pthread_condattr_destroy (pthread_condattr_t *attr); extern pthread_t __pthread_self (void); extern pthread_descr __pthread_thread_self (void); +extern pthread_descr __pthread_self_stack (void) attribute_hidden; extern int __pthread_equal (pthread_t thread1, pthread_t thread2); extern void __pthread_exit (void *retval); extern int __pthread_getschedparam (pthread_t thread, int *policy, @@ -522,4 +523,30 @@ weak_extern (__pthread_thread_self) # endif #endif +#ifndef USE_TLS +# define __manager_thread (&__pthread_manager_thread) +#else +# define __manager_thread manager_thread +#endif + +extern inline __attribute__((always_inline)) pthread_descr +check_thread_self (void) +{ + pthread_descr self = thread_self (); +#if defined THREAD_SELF && defined INIT_THREAD_SELF + if (self == __manager_thread) + { + /* A new thread might get a cancel signal before it is fully + initialized, so that the thread register might still point to the + manager thread. Double check that this is really the manager + thread. */ + self = __pthread_self_stack(); + if (self != __manager_thread) + /* Oops, thread_self() isn't working yet.. */ + INIT_THREAD_SELF(self, self->p_nr); + } +#endif + return self; +} + #endif /* internals.h */ |