Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 27 Nov 2002 07:09:18 +0000 (07:09 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 27 Nov 2002 07:09:18 +0000 (07:09 +0000)
* sysdeps/i386/tls.h (THREAD_GETMEM_NC): Change interface.  It now
takes the array member name and the index as parameters.
(THREAD_SETMEM_NC): Likewise.
* pthread_getspecific.c: Use new THREAD_GETMEM_NC interface.
* pthread_setspecific.c: Use new THREAD_GETMEM_NC and THREAD_SETMEM_NC
interfaces.

* sysdeps/i386/tls.h (THREAD_SETMEM): Use size of member element
to decide which code to use.
(THREAD_SETMEM_NC): Likewise.

nptl/ChangeLog
nptl/pthread_getspecific.c
nptl/pthread_setspecific.c
nptl/sysdeps/i386/tls.h

index e34cbcf..adac859 100644 (file)
@@ -1,5 +1,16 @@
 2002-11-26  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/i386/tls.h (THREAD_GETMEM_NC): Change interface.  It now
+       takes the array member name and the index as parameters.
+       (THREAD_SETMEM_NC): Likewise.
+       * pthread_getspecific.c: Use new THREAD_GETMEM_NC interface.
+       * pthread_setspecific.c: Use new THREAD_GETMEM_NC and THREAD_SETMEM_NC
+       interfaces.
+
+       * sysdeps/i386/tls.h (THREAD_SETMEM): Use size of member element
+       to decide which code to use.
+       (THREAD_SETMEM_NC): Likewise.
+
        * allocatestack.c (queue_stack): Don't remove stack from list here.
        Do it in the caller.  Correct condition to prematurely terminate
        loop to free stacks.
index 9e3b694..8b55364 100644 (file)
@@ -45,7 +45,7 @@ __pthread_getspecific (key)
         for this thread since the second level array is not allocated
         return NULL, too.  */
       struct pthread_key_data *level2 = THREAD_GETMEM_NC (THREAD_SELF,
-                                                         specific[idx1st]);
+                                                         specific, idx1st);
       if (level2 == NULL)
        /* Not allocated, therefore no data.  */
        return NULL;
index 5af6cae..d0ee620 100644 (file)
@@ -57,7 +57,7 @@ __pthread_setspecific (key, value)
       idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE;
 
       /* This is the second level array.  Allocate it if necessary.  */
-      level2 = THREAD_GETMEM_NC (self, specific[idx1st]);
+      level2 = THREAD_GETMEM_NC (self, specific, idx1st);
       if (level2 == NULL)
        {
          if (value == NULL)
@@ -71,7 +71,7 @@ __pthread_setspecific (key, value)
          if (level2 == NULL)
            return ENOMEM;
 
-         THREAD_SETMEM_NC (self, specific[idx1st], level2);
+         THREAD_SETMEM_NC (self, specific, idx1st, level2);
        }
 
       /* Pointer to the right array element.  */
index 244a487..4c3a73e 100644 (file)
@@ -1,4 +1,4 @@
-/* Definition for thread-local data handling.  linuxthreads/i386 version.
+/* Definition for thread-local data handling.  nptl/i386 version.
    Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -253,16 +253,17 @@ union user_desc_init
 
 
 /* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
-# define THREAD_GETMEM_NC(descr, member) \
-  ({ __typeof (descr->member) __value;                                       \
+# define THREAD_GETMEM_NC(descr, member, idx) \
+  ({ __typeof (descr->member[0]) __value;                                    \
      if (sizeof (__value) == 1)                                                      \
-       asm ("movb %%gs:(%2),%b0"                                             \
+       asm ("movb %%gs:%P2(%3),%b0"                                          \
            : "=q" (__value)                                                  \
-           : "0" (0), "r" (offsetof (struct pthread, member)));              \
+           : "0" (0), "i" (offsetof (struct pthread, member[0])),            \
+             "r" (idx));                                                     \
      else if (sizeof (__value) == 4)                                         \
-       asm ("movl %%gs:(%1),%0"                                                      \
+       asm ("movl %%gs:%P1(,%2,4),%0"                                        \
            : "=r" (__value)                                                  \
-           : "r" (offsetof (struct pthread, member)));                       \
+           : "i" (offsetof (struct pthread, member[0])), "r" (idx));         \
      else                                                                    \
        {                                                                     \
         if (sizeof (__value) != 8)                                           \
@@ -270,32 +271,32 @@ union user_desc_init
              4 or 8.  */                                                     \
           abort ();                                                          \
                                                                              \
-        asm ("movl %%gs:(%1),%%eax\n\t"                                      \
-             "movl %%gs:4(%1),%%edx"                                         \
+        asm ("movl %%gs:%P1(,%2,8),%%eax\n\t"                                \
+             "movl %%gs:4+%P1(,%2,8),%%edx"                                  \
              : "=&A" (__value)                                               \
-             : "r" (offsetof (struct pthread, member)));                     \
+             : "i" (offsetof (struct pthread, member[0])), "r" (idx));       \
        }                                                                     \
      __value; })
 
 
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
 # define THREAD_SETMEM(descr, member, value) \
-  ({ if (sizeof (value) == 1)                                                \
+  ({ if (sizeof (descr->member) == 1)                                        \
        asm volatile ("movb %0,%%gs:%P1" :                                    \
                     : "iq" (value),                                          \
                       "i" (offsetof (struct pthread, member)));              \
-     else if (sizeof (value) == 4)                                           \
+     else if (sizeof (descr->member) == 4)                                   \
        asm volatile ("movl %0,%%gs:%P1" :                                    \
                     : "ir" (value),                                          \
                       "i" (offsetof (struct pthread, member)));              \
      else                                                                    \
        {                                                                     \
-        if (sizeof (value) != 8)                                             \
+        if (sizeof (descr->member) != 8)                                     \
           /* There should not be any value with a size other than 1,         \
              4 or 8.  */                                                     \
           abort ();                                                          \
                                                                              \
-        asm volatile ("movl %%eax,%%gs:%P1\n\n"                              \
+        asm volatile ("movl %%eax,%%gs:%P1\n\t"                              \
                       "movl %%edx,%%gs:%P2" :                                \
                       : "A" (value),                                         \
                         "i" (offsetof (struct pthread, member)),             \
@@ -304,26 +305,29 @@ union user_desc_init
 
 
 /* Set member of the thread descriptor directly.  */
-# define THREAD_SETMEM_NC(descr, member, value) \
-  ({ if (sizeof (value) == 1)                                                \
-       asm volatile ("movb %0,%%gs:(%1)" :                                   \
+# define THREAD_SETMEM_NC(descr, member, idx, value) \
+  ({ if (sizeof (descr->member[0]) == 1)                                     \
+       asm volatile ("movb %0,%%gs:%P1(%2)" :                                \
                     : "iq" (value),                                          \
-                      "r" (offsetof (struct pthread, member)));              \
-     else if (sizeof (value) == 4)                                           \
-       asm volatile ("movl %0,%%gs:(%1)" :                                   \
+                      "i" (offsetof (struct pthread, member)),               \
+                      "r" (idx));                                            \
+     else if (sizeof (descr->member[0]) == 4)                                \
+       asm volatile ("movl %0,%%gs:%P1(,%2,4)" :                             \
                     : "ir" (value),                                          \
-                      "r" (offsetof (struct pthread, member)));              \
+                      "i" (offsetof (struct pthread, member)),               \
+                      "r" (idx));                                            \
      else                                                                    \
        {                                                                     \
-        if (sizeof (value) != 8)                                             \
+        if (sizeof (descr->member[0]) != 8)                                  \
           /* There should not be any value with a size other than 1,         \
              4 or 8.  */                                                     \
           abort ();                                                          \
                                                                              \
-        asm volatile ("movl %%eax,%%gs:(%1)\n\t"                             \
-                      "movl %%edx,%%gs:4(%1)" :                              \
+        asm volatile ("movl %%eax,%%gs:%P1(,%2,8)\n\t"                       \
+                      "movl %%edx,%%gs:4+%P1(,%2,8)" :                       \
                       : "A" (value),                                         \
-                        "r" (offsetof (struct pthread, member)));            \
+                        "i" (offsetof (struct pthread, member)),             \
+                        "r" (idx));                                          \
        }})