about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog11
-rw-r--r--nptl/pthread_getspecific.c2
-rw-r--r--nptl/pthread_setspecific.c4
-rw-r--r--nptl/sysdeps/i386/tls.h54
4 files changed, 43 insertions, 28 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index e34cbcf180..adac859fe5 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -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.
diff --git a/nptl/pthread_getspecific.c b/nptl/pthread_getspecific.c
index 9e3b69480a..8b55364e2e 100644
--- a/nptl/pthread_getspecific.c
+++ b/nptl/pthread_getspecific.c
@@ -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;
diff --git a/nptl/pthread_setspecific.c b/nptl/pthread_setspecific.c
index 5af6cae83e..d0ee6208c6 100644
--- a/nptl/pthread_setspecific.c
+++ b/nptl/pthread_setspecific.c
@@ -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.  */
diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h
index 244a487bcb..4c3a73effc 100644
--- a/nptl/sysdeps/i386/tls.h
+++ b/nptl/sysdeps/i386/tls.h
@@ -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));					      \
        }})