This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Fix the atomic_compare_and_exchange_*_rel definitions.
- From: Lei Xu <lei dot xu at nxp dot com>
- To: <carlos at systemhalted dot org>, <sjmunroe at us dot ibm dot com>, <libc-alpha at sourceware dot org>
- Cc: <scott dot wood at nxp dot com>, Lei Xu <lei dot xu at nxp dot com>
- Date: Sun, 12 Jun 2016 17:30:49 +0800
- Subject: [PATCH] Fix the atomic_compare_and_exchange_*_rel definitions.
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=none action=none header.from=nxp.com;nxp.com; dkim=none (message not signed) header.d=none;
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
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