From 1c3a92d81e1c297c646bc5fdfe34736dcfb09b6a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 11 Feb 2019 15:19:30 +0100 Subject: atomic.h: Add atomic_fetchadd_64() --- rtemsbsd/include/machine/atomic.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'rtemsbsd') diff --git a/rtemsbsd/include/machine/atomic.h b/rtemsbsd/include/machine/atomic.h index eb9e3ccb..ce1663cb 100644 --- a/rtemsbsd/include/machine/atomic.h +++ b/rtemsbsd/include/machine/atomic.h @@ -1057,6 +1057,32 @@ atomic_store_rel_32(volatile uint32_t *p, uint32_t v) #endif } +static inline uint64_t +atomic_fetchadd_64(volatile uint64_t *p, uint64_t v) +{ + uint64_t tmp; + +#if defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_ATOMIC) + std::atomic_uint_least64_t *q = + reinterpret_cast(const_cast(p)); + + tmp = q->fetch_add(v, std::memory_order_seq_cst); +#elif defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_STDATOMIC) + atomic_uint_least64_t *q = (atomic_uint_least64_t *)RTEMS_DEVOLATILE(uint64_t *, p); + + tmp = atomic_fetch_add_explicit(q, v, memory_order_seq_cst); +#else + rtems_interrupt_level level; + + rtems_interrupt_disable(level); + tmp = *p; + *p += v; + rtems_interrupt_enable(level); +#endif + + return (tmp); +} + static inline void atomic_add_long(volatile long *p, long v) { -- cgit v1.2.3