diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-08-15 03:58:56 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-08-15 03:58:56 +0000 |
commit | d57a3f0e0219dec6406f3477fe2eee21054c7e9c (patch) | |
tree | bd5bca09e9be0d4014810dadc6aba5fb68a52d91 /sysdeps/sparc/sparc32/bits | |
parent | 1ee598e6cd5225d53eddddb382a5403e045f9e70 (diff) | |
download | glibc-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.h | 30 |
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 */ |