summaryrefslogtreecommitdiffstats
path: root/rtemsbsd/include/machine/atomic.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-21 13:47:02 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:41 +0200
commitbcdce02d9bc8150e1d191ed5ca9da45b7604964a (patch)
tree3b2faf509db7672ee1fc98857736470be97e7ed8 /rtemsbsd/include/machine/atomic.h
parentUpdate to FreeBSD head 2018-04-01 (diff)
downloadrtems-libbsd-bcdce02d9bc8150e1d191ed5ca9da45b7604964a.tar.bz2
Update to FreeBSD head 2018-06-01
Git mirror commit fb63610a69b0eb7f69a201ba05c4c1a7a2739cf9. Update #3472.
Diffstat (limited to '')
-rw-r--r--rtemsbsd/include/machine/atomic.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/rtemsbsd/include/machine/atomic.h b/rtemsbsd/include/machine/atomic.h
index f7de4178..052df5a7 100644
--- a/rtemsbsd/include/machine/atomic.h
+++ b/rtemsbsd/include/machine/atomic.h
@@ -380,6 +380,39 @@ atomic_cmpset_int(volatile int *p, int cmp, int set)
}
static inline int
+atomic_fcmpset_int(volatile int *p, int *cmp, int set)
+{
+ int rv;
+
+#if defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_ATOMIC)
+ std::atomic_int *q =
+ reinterpret_cast<std::atomic_int *>(const_cast<int *>(p));
+
+ rv = q->compare_exchange_strong(*cmp, set, std::memory_order_seq_cst,
+ std::memory_order_relaxed);
+#elif defined(_RTEMS_BSD_MACHINE_ATOMIC_USE_STDATOMIC)
+ atomic_int *q = (atomic_int *)RTEMS_DEVOLATILE(int *, p);
+
+ rv = atomic_compare_exchange_strong_explicit(q, cmp, set,
+ memory_order_seq_cst, memory_order_relaxed);
+#else
+ rtems_interrupt_level level;
+ int actual;
+
+ rtems_interrupt_disable(level);
+ actual = *p;
+ rv = actual == *cmp;
+ *cmp = actual;
+ if (rv) {
+ *p = set;
+ }
+ rtems_interrupt_enable(level);
+#endif
+
+ return (rv);
+}
+
+static inline int
atomic_cmpset_acq_int(volatile int *p, int cmp, int set)
{
int rv;