[rtems-libbsd commit] atomic.h: Add atomic_fetchadd_64()

Sebastian Huber sebh at rtems.org
Mon Feb 11 14:20:43 UTC 2019


Module:    rtems-libbsd
Branch:    5-freebsd-12
Commit:    0b177c7c274ad90ed6843c2f99775e7e084ba8c5
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=0b177c7c274ad90ed6843c2f99775e7e084ba8c5

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Feb 11 15:19:30 2019 +0100

atomic.h: Add atomic_fetchadd_64()

---

 rtemsbsd/include/machine/atomic.h | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/rtemsbsd/include/machine/atomic.h b/rtemsbsd/include/machine/atomic.h
index eb9e3cc..ce1663c 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)
 {



More information about the vc mailing list