[PATCH rtems-libbsd 2/2] rtemsbsd/atomic: Return a value for CMPSET
Chris Johns
chrisj at rtems.org
Thu Oct 7 22:48:34 UTC 2021
OK
On 8/10/21 7:43 am, Kinsey Moore wrote:
> When the cmpset and fcmpset functions were refactored, the return value
> of the operation was discarded instead of being returned for SMP builds
> outside of gcc 4.x. This had the effect of turning these functions into
> a long busywait loop that eventually failed due to integer overflow.
>
> This patch restores the use of the return value of the atomic
> operations.
> ---
> rtemsbsd/include/machine/atomic.h | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/rtemsbsd/include/machine/atomic.h b/rtemsbsd/include/machine/atomic.h
> index 9465fefd..f25dc5d0 100644
> --- a/rtemsbsd/include/machine/atomic.h
> +++ b/rtemsbsd/include/machine/atomic.h
> @@ -530,7 +530,7 @@ atomic_clear_rel_long(volatile long *p, long v)
> #elif defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_STDATOMIC)
> #define _ATOMIC_CMPSET(T, p, cmp, set, mo) \
> atomic_##T *q = (atomic_##T *)RTEMS_DEVOLATILE(T *, p); \
> - atomic_compare_exchange_strong_explicit(q, &cmp, set, \
> + rv = atomic_compare_exchange_strong_explicit(q, &cmp, set, \
> mo, memory_order_relaxed)
> #else
> #define _ATOMIC_CMPSET(T, p, cmp, set, mo) \
> @@ -676,7 +676,7 @@ atomic_cmpset_rel_ptr(volatile uintptr_t *p, uintptr_t cmp, uintptr_t set)
> #elif defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_STDATOMIC)
> #define _ATOMIC_FCMPSET(T, p, cmp, set, mo) \
> atomic_##T *q = (atomic_##T *)RTEMS_DEVOLATILE(T *, p); \
> - atomic_compare_exchange_strong_explicit(q, cmp, set, \
> + rv = atomic_compare_exchange_strong_explicit(q, cmp, set, \
> mo, memory_order_relaxed)
> #else
> #define _ATOMIC_FCMPSET(T, p, cmp, set, mo) \
>
More information about the devel
mailing list