mirror of git://sourceware.org/git/glibc.git
Add atomic operations required by the new condition variable.
* include/atomic.h (atomic_fetch_and_relaxed, atomic_fetch_and_release, atomic_fetch_or_release, atomic_fetch_xor_release): New.
This commit is contained in:
parent
a194625ef3
commit
13cb8f76da
|
@ -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>
|
2016-08-06 Christian Seiler <christian@iwakd.de>
|
||||||
|
|
||||||
[BZ #20444]
|
[BZ #20444]
|
||||||
|
|
|
@ -611,9 +611,15 @@ void __atomic_link_error (void);
|
||||||
({ __atomic_check_size((mem)); \
|
({ __atomic_check_size((mem)); \
|
||||||
__atomic_fetch_add ((mem), (operand), __ATOMIC_ACQ_REL); })
|
__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) \
|
# define atomic_fetch_and_acquire(mem, operand) \
|
||||||
({ __atomic_check_size((mem)); \
|
({ __atomic_check_size((mem)); \
|
||||||
__atomic_fetch_and ((mem), (operand), __ATOMIC_ACQUIRE); })
|
__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) \
|
# define atomic_fetch_or_relaxed(mem, operand) \
|
||||||
({ __atomic_check_size((mem)); \
|
({ __atomic_check_size((mem)); \
|
||||||
|
@ -621,6 +627,13 @@ void __atomic_link_error (void);
|
||||||
# define atomic_fetch_or_acquire(mem, operand) \
|
# define atomic_fetch_or_acquire(mem, operand) \
|
||||||
({ __atomic_check_size((mem)); \
|
({ __atomic_check_size((mem)); \
|
||||||
__atomic_fetch_or ((mem), (operand), __ATOMIC_ACQUIRE); })
|
__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 */
|
#else /* !USE_ATOMIC_COMPILER_BUILTINS */
|
||||||
|
|
||||||
|
@ -724,12 +737,24 @@ void __atomic_link_error (void);
|
||||||
atomic_exchange_and_add_acq ((mem), (operand)); })
|
atomic_exchange_and_add_acq ((mem), (operand)); })
|
||||||
# endif
|
# 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
|
/* XXX The default for atomic_and_val has acquire semantics, but this is not
|
||||||
documented. */
|
documented. */
|
||||||
# ifndef atomic_fetch_and_acquire
|
# ifndef atomic_fetch_and_acquire
|
||||||
# define atomic_fetch_and_acquire(mem, operand) \
|
# define atomic_fetch_and_acquire(mem, operand) \
|
||||||
atomic_and_val ((mem), (operand))
|
atomic_and_val ((mem), (operand))
|
||||||
# endif
|
# 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
|
/* XXX The default for atomic_or_val has acquire semantics, but this is not
|
||||||
documented. */
|
documented. */
|
||||||
|
@ -743,6 +768,28 @@ void __atomic_link_error (void);
|
||||||
# define atomic_fetch_or_relaxed(mem, operand) \
|
# define atomic_fetch_or_relaxed(mem, operand) \
|
||||||
atomic_fetch_or_acquire ((mem), (operand))
|
atomic_fetch_or_acquire ((mem), (operand))
|
||||||
# endif
|
# 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 */
|
#endif /* !USE_ATOMIC_COMPILER_BUILTINS */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue