From b086e4672a765d89949af1ebd20555c9ee83631a Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Tue, 28 Aug 2018 12:48:58 -0400 Subject: [PATCH] libs: add atomic xxx_and_fetch apis We have the fetch_and_xxx apis, which return the _old_ value; adding the xxx_and_fetch versions, which return the new value. Signed-off-by: Mark Stapp --- lib/frratomic.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/frratomic.h b/lib/frratomic.h index 689b25255d..113f46c075 100644 --- a/lib/frratomic.h +++ b/lib/frratomic.h @@ -49,6 +49,11 @@ #define atomic_fetch_and_explicit __atomic_fetch_and #define atomic_fetch_or_explicit __atomic_fetch_or +#define atomic_add_fetch_explicit __atomic_add_fetch +#define atomic_sub_fetch_explicit __atomic_sub_fetch +#define atomic_and_fetch_explicit __atomic_and_fetch +#define atomic_or_fetch_explicit __atomic_or_fetch + #define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1, \ mem2) \ __atomic_compare_exchange_n(atom, expect, desire, 1, mem1, mem2) @@ -137,6 +142,7 @@ *_expect = rval; \ ret; \ }) + #define atomic_fetch_and_explicit(ptr, val, mem) \ ({ \ __sync_synchronize(); \ @@ -152,6 +158,36 @@ rval; \ }) +#define atomic_add_fetch_explicit(ptr, val, mem) \ + ({ \ + __sync_synchronize(); \ + typeof(*ptr) rval = __sync_add_and_fetch((ptr), (val)); \ + __sync_synchronize(); \ + rval; \ + }) +#define atomic_sub_fetch_explicit(ptr, val, mem) \ + ({ \ + __sync_synchronize(); \ + typeof(*ptr) rval = __sync_sub_and_fetch((ptr), (val)); \ + __sync_synchronize(); \ + rval; \ + }) + +#define atomic_and_fetch_explicit(ptr, val, mem) \ + ({ \ + __sync_synchronize(); \ + typeof(*ptr) rval = __sync_and_and_fetch(ptr, val); \ + __sync_synchronize(); \ + rval; \ + }) +#define atomic_or_fetch_explicit(ptr, val, mem) \ + ({ \ + __sync_synchronize(); \ + typeof(*ptr) rval = __sync_or_and_fetch(ptr, val); \ + __sync_synchronize(); \ + rval; \ + }) + #else /* !HAVE___ATOMIC && !HAVE_STDATOMIC_H */ #error no atomic functions... #endif -- 2.39.5