about summary refs log tree commit diff
path: root/nptl
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2003-03-19 08:27:55 +0000
committerRoland McGrath <roland@gnu.org>2003-03-19 08:27:55 +0000
commit9465949559fde25c36ce7116e92c8f256b08ad53 (patch)
treeeeed3393ca2d8bb8a043f5ee8da405cbaa1b8cf3 /nptl
parent043ad426e7927a49a872e915c3cde88b682aea71 (diff)
downloadglibc-9465949559fde25c36ce7116e92c8f256b08ad53.tar.gz
glibc-9465949559fde25c36ce7116e92c8f256b08ad53.tar.xz
glibc-9465949559fde25c36ce7116e92c8f256b08ad53.zip
* abilist: New directory of libfoo.abilist files maintained using
	scripts/merge-abilist.awk and "make update-abi" rules.
	* Makefile (distribute): Add abilist/*.abilist.
	* Makerules [$(build-shared) = yes] [$(subdir)] (tests):
	Depend on check-abi.
Diffstat (limited to 'nptl')
-rw-r--r--nptl/ChangeLog11
-rw-r--r--nptl/sysdeps/powerpc/tls.h6
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h19
-rw-r--r--nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h4
4 files changed, 23 insertions, 17 deletions
diff --git a/nptl/ChangeLog b/nptl/ChangeLog
index 3c9693abd0..1cfa93e1c1 100644
--- a/nptl/ChangeLog
+++ b/nptl/ChangeLog
@@ -1,5 +1,16 @@
 2003-03-18  Roland McGrath  <roland@redhat.com>
 
+	* sysdeps/unix/sysv/linux/powerpc/lowlevellock.h (__lll_test_and_set):
+	Add __lll_rel_instr first.  Add memory clobber.
+	(lll_mutex_unlock): Use __lll_test_and_set.
+	From Paul Mackerras <paulus@samba.org>.
+
+	* sysdeps/powerpc/tls.h (TLS_MULTIPLE_THREADS_IN_TCB): Define
+	unconditionally.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
+	(SINGLE_THREAD_P):  Add `header.' prefix.
+	From Paul Mackerras <paulus@samba.org>.
+
 	* Versions (libpthread: GLIBC_2.3.2): Move pthread_tryjoin_np and
 	pthread_timedjoin_np to ...
 	(libpthread: GLIBC_2.3.3): ... here.
diff --git a/nptl/sysdeps/powerpc/tls.h b/nptl/sysdeps/powerpc/tls.h
index 04d76a6e6e..0ef5655b8d 100644
--- a/nptl/sysdeps/powerpc/tls.h
+++ b/nptl/sysdeps/powerpc/tls.h
@@ -54,10 +54,8 @@ typedef union dtv
 /* The TP points to the start of the thread blocks.  */
 # define TLS_DTV_AT_TP	1
 
-/* For 32-bit, we use the multiple_threads field in the pthread struct */
-#ifndef __powerpc64__
-# define TLS_MULTIPLE_THREADS_IN_TCB	1
-#endif
+/* We use the multiple_threads field in the pthread struct */
+#define TLS_MULTIPLE_THREADS_IN_TCB	1
 
 /* Get the thread descriptor definition.  */
 # include <nptl/descr.h>
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
index 2b58d2e63a..4ffbf8deb7 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h
@@ -102,12 +102,13 @@
 /* Atomically store newval and return the old value.  */
 #define __lll_test_and_set(futex, newval)				      \
   ({ int __val;								      \
-      __asm __volatile ("1:	lwarx	%0,0,%3\n"			      \
+      __asm __volatile (__lll_rel_instr "\n"				      \
+			"1:	lwarx	%0,0,%3\n"			      \
 			"	stwcx.	%2,0,%3\n"			      \
 			"	bne-	1b"				      \
 			: "=&r" (__val), "=m" (*futex)			      \
 			: "r" (futex), "r" (newval), "1" (*futex)	      \
-			: "cr0");					      \
+			: "cr0", "memory");				      \
       __val; })
 
 
@@ -135,16 +136,12 @@ extern int __lll_timedlock_wait
   })
 
 #define lll_mutex_unlock(lock) \
-  (void) ({								      \
+  ((void) ({								      \
     int *__futex = &(lock);						      \
-     __asm __volatile (__lll_rel_instr ::: "memory");			      \
-    int __val = __lll_add (__futex, -1);				      \
-    if (__builtin_expect (__val != 1, 0))				      \
-      {									      \
-	*__futex = 0;							      \
-	lll_futex_wake (__futex, 1);					      \
-      }									      \
-  })
+    int __val = __lll_test_and_set (__futex, 0);			      \
+    if (__builtin_expect (__val > 1, 0))				      \
+      lll_futex_wake (__futex, 1);					      \
+  }))
 
 #define lll_mutex_islocked(futex) \
   (futex != 0)
diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
index 4a6cbf03da..7c9147e3cc 100644
--- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
+++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h
@@ -86,8 +86,8 @@
 
 # ifndef __ASSEMBLER__
 #  define SINGLE_THREAD_P						\
-  __builtin_expect (THREAD_GETMEM (THREAD_SELF, multiple_threads) \
-		    == 0, 1)
+  __builtin_expect (THREAD_GETMEM (THREAD_SELF,				\
+				   header.multiple_threads) == 0, 1)
 # else
 #   define SINGLE_THREAD_P						\
   lwz   10,MULTIPLE_THREADS_OFFSET(13);				\