]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib/atomlist: make C++ compatible
authorDavid Lamparter <equinox@diac24.net>
Tue, 21 Apr 2020 19:35:44 +0000 (21:35 +0200)
committerDavid Lamparter <equinox@diac24.net>
Tue, 21 Apr 2020 19:38:07 +0000 (21:38 +0200)
... by using `atomic_atomptr_t`.  Other ideas seemed worse.

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/atomlist.h
lib/frratomic.h

index 621db6824f21a83418322feb1a24b88fa328922a..96476c2cd2e61401a1c15edb1c04f0a0bf0bec1a 100644 (file)
  * 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);
 
index 1e28253f2b2ea9e6c7688692dd5261a1b296b3ba..bafc6445e5c6795d94c6efa4940e57094024785f 100644 (file)
@@ -41,6 +41,7 @@ using std::memory_order_seq_cst;
 typedef std::atomic<bool>              atomic_bool;
 typedef std::atomic<size_t>            atomic_size_t;
 typedef std::atomic<uint_fast32_t>     atomic_uint_fast32_t;
+typedef std::atomic<uintptr_t>         atomic_uintptr_t;
 
 #elif defined(HAVE_STDATOMIC_H)
 #include <stdatomic.h>
@@ -230,6 +231,7 @@ typedef std::atomic<uint_fast32_t>  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 */