diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-02-11 15:19:30 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-02-11 15:20:11 +0100 |
commit | 1c3a92d81e1c297c646bc5fdfe34736dcfb09b6a (patch) | |
tree | 50e3cb4e76c61fdefba8dd685de87ca5d0b1ae24 /rtemsbsd | |
parent | atomic.h: Add atomic_load_32() (diff) | |
download | rtems-libbsd-1c3a92d81e1c297c646bc5fdfe34736dcfb09b6a.tar.bz2 |
atomic.h: Add atomic_fetchadd_64()
Diffstat (limited to 'rtemsbsd')
-rw-r--r-- | rtemsbsd/include/machine/atomic.h | 26 |
1 files changed, 26 insertions, 0 deletions
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<std::atomic_uint_least64_t *>(const_cast<uint64_t *>(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) { |