aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim@codesourcery.com>2012-08-13 19:31:00 -0700
committerMaxim Kuvyrkov <maxim@codesourcery.com>2012-08-13 19:31:00 -0700
commit51a9ba860ae3305d475f43f568e8fa51b8a53b6e (patch)
tree77e13975116d3ca0e7c98c2ec01a63a47988f221
parentcc184e11fe3d3624c0ff622e018abc608346a342 (diff)
downloadglibc-51a9ba860ae3305d475f43f568e8fa51b8a53b6e.tar
glibc-51a9ba860ae3305d475f43f568e8fa51b8a53b6e.tar.gz
glibc-51a9ba860ae3305d475f43f568e8fa51b8a53b6e.tar.bz2
glibc-51a9ba860ae3305d475f43f568e8fa51b8a53b6e.zip
Add explicit acquire/release semantics to atomic_exchange_and_add.
-rw-r--r--ChangeLog6
-rw-r--r--include/atomic.h18
2 files changed, 22 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0377ac9b03..2adf44c736 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2012-08-13 Maxim Kuvyrkov <maxim@codesourcery.com>
+
+ * include/atomic.h (atomic_exchange_and_add): Split into ...
+ (atomic_exchange_and_add_acq, atomic_exchange_and_add_rel): ... these.
+ New atomic macros.
+
2012-08-13 Markus Trippelsdorf <markus@trippelsdorf.de>
* sysdeps/x86_64/fpu/libm-test-ulps: Update.
diff --git a/include/atomic.h b/include/atomic.h
index 3ccb46d9ed..bc20772f2b 100644
--- a/include/atomic.h
+++ b/include/atomic.h
@@ -198,8 +198,12 @@
/* Add VALUE to *MEM and return the old value of *MEM. */
-#ifndef atomic_exchange_and_add
-# define atomic_exchange_and_add(mem, value) \
+#ifndef atomic_exchange_and_add_acq
+# ifdef atomic_exchange_and_add
+# define atomic_exchange_and_add_acq(mem, value) \
+ atomic_exchange_and_add (mem, value)
+# else
+# define atomic_exchange_and_add_acq(mem, value) \
({ __typeof (*(mem)) __atg6_oldval; \
__typeof (mem) __atg6_memp = (mem); \
__typeof (*(mem)) __atg6_value = (value); \
@@ -213,8 +217,18 @@
__atg6_oldval), 0)); \
\
__atg6_oldval; })
+# endif
#endif
+#ifndef atomic_exchange_and_add_rel
+# define atomic_exchange_and_add_rel(mem, value) \
+ atomic_exchange_and_add_acq(mem, value)
+#endif
+
+#ifndef atomic_exchange_and_add
+# define atomic_exchange_and_add(mem, value) \
+ atomic_exchange_and_add_acq(mem, value)
+#endif
#ifndef catomic_exchange_and_add
# define catomic_exchange_and_add(mem, value) \