2003-03-10 Roland McGrath <roland@redhat.com>
authorroland <roland>
Mon, 10 Mar 2003 08:50:31 +0000 (08:50 +0000)
committerroland <roland>
Mon, 10 Mar 2003 08:50:31 +0000 (08:50 +0000)
* descr.h (struct pthread): Conditionalize first member on
[!TLS_DTV_AT_TP].  Replace the `header' member with an anonymous union
containing an anonymous tcbhead_t.  Move `list' member out.
[TLS_MULTIPLE_THREADS_IN_TCB]: Define a `multiple_threads' member.
* allocatestack.c: Remove use of `header.data.' prefix.
* pthread_create.c: Likewise.
* init.c (__pthread_initialize_minimal_internal): Likewise.
* sysdeps/pthread/createthread.c (create_thread): Likewise.
* sysdeps/i386/tls.h (INSTALL_DTV): Add parens.
(THREAD_SELF, THREAD_DTV, INSTALL_NEW_DTV): No `header.data.' prefix.
* sysdeps/x86_64/tls.h: Likewise.
* sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
(SINGLE_THREAD_P): Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
(SINGLE_THREAD_P): Likewise.
* sysdeps/i386/tls.h (tcbhead_t): Remove `list' member.
* sysdeps/s390/tls.h (tcbhead_t): Likewise.

nptl/descr.h
nptl/init.c
nptl/pthread_create.c
nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
nptl/sysdeps/x86_64/tls.h

index f189a6e..cbaa38f 100644 (file)
@@ -31,6 +31,7 @@
 #include <pthreaddef.h>
 #include <dl-sysdep.h>
 #include "../nptl_db/thread_db.h"
+#include <tls.h>
 
 
 #ifndef TCB_ALIGNMENT
 /* Thread descriptor data structure.  */
 struct pthread
 {
-  /* XXX Remove this union for IA-64 style TLS module */
+#if !TLS_DTV_AT_TP
+  /* This overlaps tcbhead_t (see tls.h), as used for TLS without threads.  */
   union
   {
-    /* It is very important to always append new elements.  The offsets
-       of some of the elements of the struct are used in assembler code.  */
-    struct
-    {
-      void *tcb;                /* Pointer to the TCB.  This is not always
-                                   the address of this thread descriptor.  */
-      union dtv *dtvp;
-      struct pthread *self;       /* Pointer to this structure */
-      int multiple_threads;
-#ifdef NEED_DL_SYSINFO
-      uintptr_t sysinfo;
-#endif
-      list_t list;
-    } data;
+    tcbhead_t;
     void *__padding[16];
-  } header;
+  };
+#elif TLS_MULTIPLE_THREADS_IN_TCB
+  int multiple_threads;
+#endif
+
+  /* This descriptor's link on the `stack_used' or `__stack_user' list.  */
+  list_t list;
 
   /* Thread ID - which is also a 'is this thread descriptor (and
      therefore stack) used' flag.  */
index 16926e4..e0100ee 100644 (file)
@@ -194,7 +194,7 @@ __pthread_initialize_minimal_internal (void)
 
   /* Initialize the list of all running threads with the main thread.  */
   INIT_LIST_HEAD (&__stack_user);
-  list_add (&pd->header.data.list, &__stack_user);
+  list_add (&pd->list, &__stack_user);
 
 
   /* Install the cancellation signal handler.  If for some reason we
index 2ec70ea..c1da67d 100644 (file)
@@ -78,7 +78,7 @@ __find_in_stack_list (pd)
     {
       struct pthread *curp;
 
-      curp = list_entry (entry, struct pthread, header.data.list);
+      curp = list_entry (entry, struct pthread, list);
       if (curp == pd)
        {
          result = curp;
@@ -91,7 +91,7 @@ __find_in_stack_list (pd)
       {
        struct pthread *curp;
 
-       curp = list_entry (entry, struct pthread, header.data.list);
+       curp = list_entry (entry, struct pthread, list);
        if (curp == pd)
          {
            result = curp;
@@ -345,11 +345,11 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg)
      the stack freshly allocated with 'mmap'.  */
 
   /* Reference to the TCB itself.  */
-  pd->header.data.self = pd;
+  pd->self = pd;
 
 #ifdef TLS_TCB_AT_TP
-  /* Self-reference.  */
-  pd->header.data.tcb = pd;
+  /* Self-reference for TLS.  */
+  pd->tcb = pd;
 #endif
 
   /* Store the address of the start routine and the parameter.  Since
index d9b51a4..6abb59a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
 
@@ -78,8 +78,7 @@
 
 # ifndef __ASSEMBLER__
 #  define SINGLE_THREAD_P \
-  __builtin_expect (THREAD_GETMEM (THREAD_SELF,                                      \
-                                  header.data.multiple_threads) == 0, 1)
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) == 0, 1)
 # else
 #  define SINGLE_THREAD_P cmpl $0, %gs:MULTIPLE_THREADS_OFFSET
 # endif
index 07bac6d..2714747 100644 (file)
 
 # ifndef __ASSEMBLER__
 #  define SINGLE_THREAD_P \
-  __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
-                                  header.data.multiple_threads) == 0, 1)
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) == 0, 1)
 # else
 #  define SINGLE_THREAD_P \
        stc gbr,r0; \
index 66e878e..ae1c66e 100644 (file)
@@ -84,12 +84,12 @@ typedef struct
 /* Install the dtv pointer.  The pointer passed is to the element with
    index -1 which contain the length.  */
 # define INSTALL_DTV(descr, dtvp) \
-  ((tcbhead_t *) (descr))->dtv = dtvp + 1
+  ((tcbhead_t *) (descr))->dtv = (dtvp) + 1
 
 /* Install new dtv for current thread.  */
-# define INSTALL_NEW_DTV(dtv) \
+# define INSTALL_NEW_DTV(dtvp) \
   ({ struct pthread *__pd;                                                   \
-     THREAD_SETMEM (__pd, header.data.dtvp, dtv); })
+     THREAD_SETMEM (__pd, dtv, (dtvp)); })
 
 /* Return dtv of given thread descriptor.  */
 # define GET_DTV(descr) \
@@ -133,7 +133,7 @@ typedef struct
 /* Return the address of the dtv for the current thread.  */
 # define THREAD_DTV() \
   ({ struct pthread *__pd;                                                   \
-     THREAD_GETMEM (__pd, header.data.dtvp); })
+     THREAD_GETMEM (__pd, dtv); })
 
 
 /* Return the thread descriptor for the current thread.
@@ -145,7 +145,7 @@ typedef struct
 # define THREAD_SELF \
   ({ struct pthread *__self;                                                 \
      asm ("movq %%fs:%c1,%0" : "=r" (__self)                                 \
-         : "i" (offsetof (struct pthread, header.data.self)));               \
+         : "i" (offsetof (struct pthread, self)));                           \
      __self;})