about summary refs log tree commit diff
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.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.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 */