[PATCH] Fix the atomic_compare_and_exchange_*_rel definitions.
Lei Xu
lei.xu@nxp.com
Sun Jun 12 09:47:00 GMT 2016
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
More information about the Libc-alpha
mailing list