]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 17 Sep 2003 05:04:16 +0000 (05:04 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 17 Sep 2003 05:04:16 +0000 (05:04 +0000)
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.

linuxthreads/ChangeLog
linuxthreads/descr.h
linuxthreads/internals.h
linuxthreads/sighandler.c

index 62d4df0f62b84b18020e60a99058f523271b30e7..3385353bd43a8783913d86e789d7873e9088177f 100644 (file)
@@ -1,3 +1,17 @@
+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.
+
 2003-09-15  Jakub Jelinek  <jakub@redhat.com>
 
        * Makefile (CFLAGS-mutex.c): Add $(uses-callbacks).
index f00278cb5188b8ca9271201379f15058a20c8964..0b9efd220d783cf48d6995159a69d6ffe5108150 100644 (file)
@@ -217,6 +217,7 @@ extern char *__pthread_manager_thread_tos;
 /* Descriptor of the manager thread */
 
 extern struct _pthread_descr_struct __pthread_manager_thread;
+extern pthread_descr manager_thread attribute_hidden;
 
 /* Indicate whether at least one thread has a user-defined stack (if 1),
    or all threads have stacks supplied by LinuxThreads (if 0). */
index a5ec8b92841b02a3e9bf7fc99be7b5a28425c1a7..90649335bb263b54984711bf4340d378e1a6bf6d 100644 (file)
@@ -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 */
index ab8b38e539a60ac26b62432a3af82cf4fea8cd0d..9dd3e228f695434c8e58d03ad9ef27d067e9b3cf 100644 (file)
@@ -22,7 +22,8 @@ void __pthread_sighandler(int signo, SIGCONTEXT ctx)
 {
   pthread_descr self;
   char * in_sighandler;
-  self = thread_self();
+  self = check_thread_self();
+
   /* If we're in a sigwait operation, just record the signal received
      and return without calling the user's handler */
   if (THREAD_GETMEM(self, p_sigwaiting)) {
@@ -46,7 +47,8 @@ void __pthread_sighandler_rt(int signo, struct siginfo *si,
 {
   pthread_descr self;
   char * in_sighandler;
-  self =  thread_self();
+  self = check_thread_self();
+
   /* If we're in a sigwait operation, just record the signal received
      and return without calling the user's handler */
   if (THREAD_GETMEM(self, p_sigwaiting)) {