From: Maxim Kuvyrkov Date: Tue, 14 Aug 2012 02:55:34 +0000 (-0700) Subject: Add explicit acquire/release semantics to MIPS' atomic_exchange_and_add. X-Git-Tag: upstream/2.30~10455 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8f12da979523f5f95190d41fcef7e833b773a92d;p=external%2Fglibc.git Add explicit acquire/release semantics to MIPS' atomic_exchange_and_add. --- diff --git a/ports/ChangeLog.mips b/ports/ChangeLog.mips index 0c503bc..f8a9af1 100644 --- a/ports/ChangeLog.mips +++ b/ports/ChangeLog.mips @@ -1,3 +1,14 @@ +2012-08-13 Maxim Kuvyrkov + + [__GNUC_PREREQ (4, 8)] + (atomic_exchange_and_add): Split into ... + (atomic_exchange_and_add_acq, atomic_exchange_and_add_rel): ... these. + New atomic macros. + [!__GNUC_PREREQ (4, 8)] + (atomic_exchange_and_add): Split into ... + (atomic_exchange_and_add_acq, atomic_exchange_and_add_rel): ... these. + New atomic macros. + 2012-08-09 Joseph Myers * sysdeps/unix/sysv/linux/mips/kernel-features.h diff --git a/ports/sysdeps/mips/bits/atomic.h b/ports/sysdeps/mips/bits/atomic.h index b094273..749e166 100644 --- a/ports/sysdeps/mips/bits/atomic.h +++ b/ports/sysdeps/mips/bits/atomic.h @@ -193,11 +193,13 @@ typedef uintmax_t uatomic_max_t; __atomic_fetch_add (mem, value, model) # endif -/* ??? Barrier semantics for atomic_exchange_and_add appear to be - undefined. Use full barrier for now, as that's safe. */ -# define atomic_exchange_and_add(mem, value) \ +# define atomic_exchange_and_add_acq(mem, value) \ __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ - __ATOMIC_ACQ_REL) + __ATOMIC_ACQUIRE) + +# define atomic_exchange_and_add_rel(mem, value) \ + __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ + __ATOMIC_RELEASE) #else /* !__GNUC_PREREQ (4, 8) */ /* This implementation using inline assembly will be removed once glibc requires GCC 4.8 or later to build. */ @@ -434,11 +436,13 @@ typedef uintmax_t uatomic_max_t; __prev; }) # endif -/* ??? Barrier semantics for atomic_exchange_and_add appear to be - undefined. Use full barrier for now, as that's safe. */ -# define atomic_exchange_and_add(mem, value) \ - __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ - MIPS_SYNC_STR, MIPS_SYNC_STR) +# define atomic_exchange_and_add_acq(mem, value) \ + __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ + "", MIPS_SYNC_STR) + +# define atomic_exchange_and_add_rel(mem, value) \ + __atomic_val_bysize (__arch_exchange_and_add, int, mem, value, \ + MIPS_SYNC_STR, "") #endif /* __GNUC_PREREQ (4, 8) */ /* TODO: More atomic operations could be implemented efficiently; only the