This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix the atomic_compare_and_exchange_*_rel definitions.


In current code, atomic_compare_and_exchange_*_rel is defined as
atomic_compare_and_exchange_*_acq, however this is wrong on power arch,
especially __arch_*_rel has been defined on power arch.
This has caused segmentation fault issue
when doing pthread_mutex_lock/unlock operations on PowerPC E6500.

Considering generic code should never be assuming that an acquire barrier
can be used in place of a release barrier(If it's OK for a particular arch
let the arch define them as being the same), fix this issue as follows:

For atomic_compare_and_exchange_val_rel:
If arch defines __arch_compare_and_exchange_val_32_rel,
defines to __arch_compare_and_exchange_val_*_rel;
otherwise defines to atomic_compare_and_exchange_val_acq.
For atomic_compare_and_exchange_bool_rel:
If arch defines __arch_compare_and_exchange_bool_32_rel,
defines to __arch_compare_and_exchange_bool_*_rel,
otherwise defines to atomic_compare_and_exchange_val_rel.
For catomic_compare_and_exchange_bool_rel:
If defines atomic_compare_and_exchange_bool_rel,
defines to atomic_compare_and_exchange_bool_rel,
otherwise defines to catomic_compare_and_exchange_val_rel.

Signed-off-by: Lei Xu <lei.xu@nxp.com>
---
 include/atomic.h |   38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/include/atomic.h b/include/atomic.h
index 5e8bfff..effb5af 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -106,6 +106,18 @@
 #endif
 
 
+#ifndef atomic_compare_and_exchange_val_rel
+# ifdef __arch_compare_and_exchange_val_32_rel
+#  define atomic_compare_and_exchange_val_rel(mem, newval, oldval) \
+	__atomic_val_bysize(__arch_compare_and_exchange_val, rel,	      \
+		       mem, newval, oldval)
+# else
+# define atomic_compare_and_exchange_val_rel(mem, newval, oldval)	      \
+	atomic_compare_and_exchange_val_acq(mem, newval, oldval)
+# endif
+#endif
+
+
 #ifndef catomic_compare_and_exchange_val_rel
 # ifndef atomic_compare_and_exchange_val_rel
 #  define catomic_compare_and_exchange_val_rel(mem, newval, oldval)	      \
@@ -117,12 +129,6 @@
 #endif
 
 
-#ifndef atomic_compare_and_exchange_val_rel
-# define atomic_compare_and_exchange_val_rel(mem, newval, oldval)	      \
-  atomic_compare_and_exchange_val_acq (mem, newval, oldval)
-#endif
-
-
 /* Atomically store NEWVAL in *MEM if *MEM is equal to OLDVAL.
    Return zero if *MEM was changed or non-zero if no exchange happened.  */
 #ifndef atomic_compare_and_exchange_bool_acq
@@ -159,10 +165,22 @@
 #endif
 
 
+#ifndef atomic_compare_and_exchange_bool_rel
+# ifdef __arch_compare_and_exchange_bool_32_rel
+#  define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \
+	__atomic_bool_bysize(__arch_compare_and_exchange_bool, rel,	      \
+				mem, newval, oldval)
+# else
+# define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \
+	atomic_compare_and_exchange_val_rel(mem, newval, oldval)
+# endif
+#endif
+
+
 #ifndef catomic_compare_and_exchange_bool_rel
 # ifndef atomic_compare_and_exchange_bool_rel
 #  define catomic_compare_and_exchange_bool_rel(mem, newval, oldval)	      \
-  catomic_compare_and_exchange_bool_acq (mem, newval, oldval)
+	catomic_compare_and_exchange_val_rel(mem, newval, oldval)
 # else
 #  define catomic_compare_and_exchange_bool_rel(mem, newval, oldval)	      \
   atomic_compare_and_exchange_bool_rel (mem, newval, oldval)
@@ -170,12 +188,6 @@
 #endif
 
 
-#ifndef atomic_compare_and_exchange_bool_rel
-# define atomic_compare_and_exchange_bool_rel(mem, newval, oldval) \
-  atomic_compare_and_exchange_bool_acq (mem, newval, oldval)
-#endif
-
-
 /* Store NEWVALUE in *MEM and return the old value.  */
 #ifndef atomic_exchange_acq
 # define atomic_exchange_acq(mem, newvalue) \
-- 
1.7.9.5


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]