diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-08-21 13:47:02 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2018-09-21 10:29:41 +0200 |
commit | bcdce02d9bc8150e1d191ed5ca9da45b7604964a (patch) | |
tree | 3b2faf509db7672ee1fc98857736470be97e7ed8 /rtemsbsd/include/machine/atomic.h | |
parent | Update to FreeBSD head 2018-04-01 (diff) | |
download | rtems-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.h | 33 |
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; |