aboutsummaryrefslogtreecommitdiff
path: root/linuxthreads/internals.h
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-09-17 05:04:16 +0000
committerUlrich Drepper <drepper@redhat.com>2003-09-17 05:04:16 +0000
commita243f94e3636a48142e93dffb4f919f4595f91e8 (patch)
tree2d74b570a88632dd5426c60f21245c88f444e242 /linuxthreads/internals.h
parent65947215c78a870c9e0b0217a7bd949164e1993b (diff)
downloadglibc-a243f94e3636a48142e93dffb4f919f4595f91e8.tar
glibc-a243f94e3636a48142e93dffb4f919f4595f91e8.tar.gz
glibc-a243f94e3636a48142e93dffb4f919f4595f91e8.tar.bz2
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.h27
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 */