From 5d6299d7da75eb60892c20affb687a523cc173db Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Tue, 21 Apr 2020 21:35:44 +0200 Subject: [PATCH] lib/atomlist: make C++ compatible ... by using `atomic_atomptr_t`. Other ideas seemed worse. Signed-off-by: David Lamparter --- lib/atomlist.h | 26 +++++++++++++++----------- lib/frratomic.h | 2 ++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/atomlist.h b/lib/atomlist.h index 621db6824f..96476c2cd2 100644 --- a/lib/atomlist.h +++ b/lib/atomlist.h @@ -34,7 +34,11 @@ * ATOMPTR_USER is currently unused (and available for atomic hash or skiplist * implementations.) */ -typedef uintptr_t atomptr_t; + +/* atomic_atomptr_t may look a bit odd, it's for the sake of C++ compat */ +typedef uintptr_t atomptr_t; +typedef atomic_uintptr_t atomic_atomptr_t; + #define ATOMPTR_MASK (UINTPTR_MAX - 3) #define ATOMPTR_LOCK (1) #define ATOMPTR_USER (2) @@ -104,13 +108,13 @@ static inline bool atomptr_u(atomptr_t val) /* don't use these structs directly */ struct atomlist_item { - _Atomic atomptr_t next; + atomic_uintptr_t next; }; #define atomlist_itemp(val) ((struct atomlist_item *)atomptr_p(val)) struct atomlist_head { - _Atomic atomptr_t first, last; - _Atomic size_t count; + atomic_uintptr_t first, last; + atomic_size_t count; }; /* use as: @@ -133,7 +137,7 @@ macro_inline void prefix ## _add_head(struct prefix##_head *h, type *item) \ macro_inline void prefix ## _add_tail(struct prefix##_head *h, type *item) \ { atomlist_add_tail(&h->ah, &item->field.ai); } \ macro_inline void prefix ## _del_hint(struct prefix##_head *h, type *item, \ - _Atomic atomptr_t *hint) \ + atomic_atomptr_t *hint) \ { atomlist_del_hint(&h->ah, &item->field.ai, hint); } \ macro_inline type *prefix ## _del(struct prefix##_head *h, type *item) \ { atomlist_del_hint(&h->ah, &item->field.ai, NULL); \ @@ -189,7 +193,7 @@ void atomlist_add_tail(struct atomlist_head *h, struct atomlist_item *item); * reads starting later. */ void atomlist_del_hint(struct atomlist_head *h, struct atomlist_item *item, - _Atomic atomptr_t *hint); + atomic_atomptr_t *hint); /* pop: * @@ -202,13 +206,13 @@ struct atomlist_item *atomlist_pop(struct atomlist_head *h); struct atomsort_item { - _Atomic atomptr_t next; + atomic_atomptr_t next; }; #define atomsort_itemp(val) ((struct atomsort_item *)atomptr_p(val)) struct atomsort_head { - _Atomic atomptr_t first; - _Atomic size_t count; + atomic_atomptr_t first; + atomic_size_t count; }; #define _PREDECL_ATOMSORT(prefix) \ @@ -271,7 +275,7 @@ macro_inline type *prefix ## _find_lt(struct prefix##_head *h, \ return prev; \ } \ macro_inline void prefix ## _del_hint(struct prefix##_head *h, type *item, \ - _Atomic atomptr_t *hint) \ + atomic_atomptr_t *hint) \ { \ atomsort_del_hint(&h->ah, &item->field.ai, hint); \ } \ @@ -353,7 +357,7 @@ struct atomsort_item *atomsort_add(struct atomsort_head *h, const struct atomsort_item *)); void atomsort_del_hint(struct atomsort_head *h, - struct atomsort_item *item, _Atomic atomptr_t *hint); + struct atomsort_item *item, atomic_atomptr_t *hint); struct atomsort_item *atomsort_pop(struct atomsort_head *h); diff --git a/lib/frratomic.h b/lib/frratomic.h index 1e28253f2b..bafc6445e5 100644 --- a/lib/frratomic.h +++ b/lib/frratomic.h @@ -41,6 +41,7 @@ using std::memory_order_seq_cst; typedef std::atomic atomic_bool; typedef std::atomic atomic_size_t; typedef std::atomic atomic_uint_fast32_t; +typedef std::atomic atomic_uintptr_t; #elif defined(HAVE_STDATOMIC_H) #include @@ -230,6 +231,7 @@ typedef std::atomic atomic_uint_fast32_t; typedef _Atomic bool atomic_bool; typedef _Atomic size_t atomic_size_t; typedef _Atomic uint_fast32_t atomic_uint_fast32_t; +typedef _Atomic uintptr_t atomic_uintptr_t; #endif #endif /* _FRRATOMIC_H */