about summary refs log tree commit diff
path: root/sysdeps/sparc/sparc32/bits
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-08-15 03:58:56 +0000
committerUlrich Drepper <drepper@redhat.com>2003-08-15 03:58:56 +0000
commitd57a3f0e0219dec6406f3477fe2eee21054c7e9c (patch)
treebd5bca09e9be0d4014810dadc6aba5fb68a52d91 /sysdeps/sparc/sparc32/bits
parent1ee598e6cd5225d53eddddb382a5403e045f9e70 (diff)
downloadglibc-d57a3f0e0219dec6406f3477fe2eee21054c7e9c.tar.gz
glibc-d57a3f0e0219dec6406f3477fe2eee21054c7e9c.tar.xz
glibc-d57a3f0e0219dec6406f3477fe2eee21054c7e9c.zip
Update.
2003-08-11  Carlos O'Donell  <carlos@baldric.uwo.ca>

	* dlfcn/default.c (main): Cast dlsym loaded value to same type as main.
	Address passed to test_in_mod1 and test_in_mod2 without casting.
	* dlfcn/defaultmod1.c: Change prototype of test_in_mod1.
	(test_in_mod1): Cast dlsym loaded value to same type as mainp.
	* dlfcn/defaultmod2.c: Change prototype of test_in_mod2.
	(test_in_mod2): Cast dlsym loaded value to same type as mainp.

2003-08-15  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/sparc/sparc32/elf/configure.in (libc_cv_sparc32_tls):
	Change quotes before using [].

	* sysdeps/unix/sysv/linux/sparc/sys/user.h: New file.

	* sysdeps/sparc/sparc32/bits/atomic.h (__sparc32_atomic_lock):
	Renamed to...
	(__sparc32_atomic_locks): ...this.  Change into 64-byte array.
	(__sparc32_atomic_do_lock, __sparc32_atomic_do_unlock): Add addr
	argument.  Select one of 64 locks from address bits.
	(atomic_compare_and_exchange_val_acq,
	atomic_compare_and_exchange_bool_acq): Pass memory address to
	__sparc32_atomic_do_{,un}lock.
Diffstat (limited to 'sysdeps/sparc/sparc32/bits')
-rw-r--r--sysdeps/sparc/sparc32/bits/atomic.h30
1 files changed, 18 insertions, 12 deletions
diff --git a/sysdeps/sparc/sparc32/bits/atomic.h b/sysdeps/sparc/sparc32/bits/atomic.h
index c4e0abfe06..00d799392b 100644
--- a/sysdeps/sparc/sparc32/bits/atomic.h
+++ b/sysdeps/sparc/sparc32/bits/atomic.h
@@ -22,28 +22,34 @@
 #define _BITS_ATOMIC_H	1
 
 /* We have no compare and swap, just test and set.
-   The following implementation contends on one single global lock
+   The following implementation contends on 64 global locks
    per library and assumes no variable will be accessed using atomic.h
    macros from two different libraries.  */
 
-volatile unsigned char __sparc32_atomic_lock
-  __attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_lock"),
+volatile unsigned char __sparc32_atomic_locks[64]
+  __attribute__ ((nocommon, section (".gnu.linkonce.b.__sparc32_atomic_locks"),
 		  visibility ("hidden")));
 
-#define __sparc32_atomic_do_lock() \
+#define __sparc32_atomic_do_lock(addr) \
   do								      \
     {								      \
       unsigned int __old_lock;					      \
+      unsigned int __idx = (((long) addr >> 2) ^ ((long) addr >> 12)) \
+			   & 63;				      \
       do							      \
 	__asm ("ldstub %1, %0"					      \
-	       : "=r" (__old_lock), "=m" (__sparc32_atomic_lock)      \
-	       : "m" (__sparc32_atomic_lock));			      \
+	       : "=r" (__old_lock),				      \
+		 "=m" (__sparc32_atomic_locks[__idx])		      \
+	       : "m" (__sparc32_atomic_locks[__idx]));		      \
       while (__old_lock);					      \
     }								      \
   while (0)
 
-#define __sparc32_atomic_do_unlock() \
-  do __sparc32_atomic_lock = 0; while (0)
+#define __sparc32_atomic_do_unlock(addr) \
+  do								      \
+    __sparc32_atomic_locks[(((long) addr >> 2)			      \
+			    ^ ((long) addr >> 12)) & 63] = 0;	      \
+  while (0)
 
 /* The only basic operation needed is compare and exchange.  */
 #define atomic_compare_and_exchange_val_acq(mem, newval, oldval) \
@@ -51,11 +57,11 @@ volatile unsigned char __sparc32_atomic_lock
      __typeof (*mem) __acev_ret;				      \
      __typeof (*mem) __acev_newval = (newval);			      \
 								      \
-     __sparc32_atomic_do_lock ();				      \
+     __sparc32_atomic_do_lock (__acev_memp);			      \
      __acev_ret = *__acev_memp;					      \
      if (__acev_ret == (oldval))				      \
        *__acev_memp = __acev_newval;				      \
-     __sparc32_atomic_do_unlock ();				      \
+     __sparc32_atomic_do_unlock (__acev_memp);			      \
      __acev_ret; })
 
 #define atomic_compare_and_exchange_bool_acq(mem, newval, oldval) \
@@ -63,13 +69,13 @@ volatile unsigned char __sparc32_atomic_lock
      int __aceb_ret;						      \
      __typeof (*mem) __aceb_newval = (newval);			      \
 								      \
-     __sparc32_atomic_do_lock ();				      \
+     __sparc32_atomic_do_lock (__aceb_memp);			      \
      __aceb_ret = 0;						      \
      if (*__aceb_memp == (oldval))				      \
        *__aceb_memp = __aceb_newval;				      \
      else							      \
        __aceb_ret = 1;						      \
-     __sparc32_atomic_do_unlock ();				      \
+     __sparc32_atomic_do_unlock (__aceb_memp);			      \
      __aceb_ret; })
 
 #endif	/* bits/atomic.h */