]> sourceware.org Git - glibc.git/commitdiff
Add atomic operations required by the new condition variable.
authorTorvald Riegel <triegel@redhat.com>
Wed, 25 May 2016 22:57:27 +0000 (00:57 +0200)
committerTorvald Riegel <triegel@redhat.com>
Tue, 9 Aug 2016 10:13:11 +0000 (12:13 +0200)
* include/atomic.h (atomic_fetch_and_relaxed,
atomic_fetch_and_release, atomic_fetch_or_release,
atomic_fetch_xor_release): New.

ChangeLog
include/atomic.h

index d8ba9cd57d8547772c6d98c970355b532df8b186..6a3637cb24dae9883725c1cfef6675a15017ac66 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-08-09  Torvald Riegel  <triegel@redhat.com>
+
+       * include/atomic.h (atomic_fetch_and_relaxed,
+       atomic_fetch_and_release, atomic_fetch_or_release,
+       atomic_fetch_xor_release): New.
+
 2016-08-06  Christian Seiler  <christian@iwakd.de>
 
        [BZ #20444]
index 129ee24426776de342335a2456f477516cb9d346..5a8e7e7966d6cab78ef918e98cc5797df0a2dc2e 100644 (file)
@@ -611,9 +611,15 @@ void __atomic_link_error (void);
   ({ __atomic_check_size((mem));                                             \
   __atomic_fetch_add ((mem), (operand), __ATOMIC_ACQ_REL); })
 
+# define atomic_fetch_and_relaxed(mem, operand) \
+  ({ __atomic_check_size((mem));                                             \
+  __atomic_fetch_and ((mem), (operand), __ATOMIC_RELAXED); })
 # define atomic_fetch_and_acquire(mem, operand) \
   ({ __atomic_check_size((mem));                                             \
   __atomic_fetch_and ((mem), (operand), __ATOMIC_ACQUIRE); })
+# define atomic_fetch_and_release(mem, operand) \
+  ({ __atomic_check_size((mem));                                             \
+  __atomic_fetch_and ((mem), (operand), __ATOMIC_RELEASE); })
 
 # define atomic_fetch_or_relaxed(mem, operand) \
   ({ __atomic_check_size((mem));                                             \
@@ -621,6 +627,13 @@ void __atomic_link_error (void);
 # define atomic_fetch_or_acquire(mem, operand) \
   ({ __atomic_check_size((mem));                                             \
   __atomic_fetch_or ((mem), (operand), __ATOMIC_ACQUIRE); })
+# define atomic_fetch_or_release(mem, operand) \
+  ({ __atomic_check_size((mem));                                             \
+  __atomic_fetch_or ((mem), (operand), __ATOMIC_RELEASE); })
+
+# define atomic_fetch_xor_release(mem, operand) \
+  ({ __atomic_check_size((mem));                                             \
+  __atomic_fetch_xor ((mem), (operand), __ATOMIC_RELEASE); })
 
 #else /* !USE_ATOMIC_COMPILER_BUILTINS  */
 
@@ -724,12 +737,24 @@ void __atomic_link_error (void);
    atomic_exchange_and_add_acq ((mem), (operand)); })
 # endif
 
+/* XXX Fall back to acquire MO because archs do not define a weaker
+   atomic_and_val.  */
+# ifndef atomic_fetch_and_relaxed
+#  define atomic_fetch_and_relaxed(mem, operand) \
+   atomic_fetch_and_acquire ((mem), (operand))
+# endif
 /* XXX The default for atomic_and_val has acquire semantics, but this is not
    documented.  */
 # ifndef atomic_fetch_and_acquire
 #  define atomic_fetch_and_acquire(mem, operand) \
    atomic_and_val ((mem), (operand))
 # endif
+# ifndef atomic_fetch_and_release
+/* XXX This unnecessarily has acquire MO.  */
+#  define atomic_fetch_and_release(mem, operand) \
+   ({ atomic_thread_fence_release ();                                        \
+   atomic_and_val ((mem), (operand)); })
+# endif
 
 /* XXX The default for atomic_or_val has acquire semantics, but this is not
    documented.  */
@@ -743,6 +768,28 @@ void __atomic_link_error (void);
 #  define atomic_fetch_or_relaxed(mem, operand) \
    atomic_fetch_or_acquire ((mem), (operand))
 # endif
+/* XXX Contains an unnecessary acquire MO because archs do not define a weaker
+   atomic_or_val.  */
+# ifndef atomic_fetch_or_release
+#  define atomic_fetch_or_release(mem, operand) \
+   ({ atomic_thread_fence_release ();                                        \
+   atomic_fetch_or_acquire ((mem), (operand)); })
+# endif
+
+# ifndef atomic_fetch_xor_release
+# define atomic_fetch_xor_release(mem, operand) \
+  ({ __typeof (*(mem)) __atg104_old;                                         \
+     __typeof (mem) __atg104_memp = (mem);                                   \
+     __typeof (*(mem)) __atg104_op = (operand);                                      \
+                                                                             \
+     do                                                                              \
+       __atg104_old = (*__atg104_memp);                                              \
+     while (__builtin_expect                                                 \
+           (atomic_compare_and_exchange_bool_rel (                           \
+               __atg104_memp, __atg104_old ^ __atg104_op, __atg104_old), 0));\
+                                                                             \
+     __atg104_old; })
+#endif
 
 #endif /* !USE_ATOMIC_COMPILER_BUILTINS  */
 
This page took 0.18503 seconds and 5 git commands to generate.