summaryrefslogtreecommitdiffstats
path: root/rtemsbsd
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-11 15:19:30 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-02-11 15:20:11 +0100
commit1c3a92d81e1c297c646bc5fdfe34736dcfb09b6a (patch)
tree50e3cb4e76c61fdefba8dd685de87ca5d0b1ae24 /rtemsbsd
parentatomic.h: Add atomic_load_32() (diff)
downloadrtems-libbsd-1c3a92d81e1c297c646bc5fdfe34736dcfb09b6a.tar.bz2
atomic.h: Add atomic_fetchadd_64()
Diffstat (limited to 'rtemsbsd')
-rw-r--r--rtemsbsd/include/machine/atomic.h26
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)
{