]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: add atomic bitwise OR, AND
authorQuentin Young <qlyoung@cumulusnetworks.com>
Wed, 28 Feb 2018 21:11:42 +0000 (16:11 -0500)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Wed, 28 Feb 2018 21:50:49 +0000 (16:50 -0500)
* Add support for C11 bitwise OR & AND operations
* Add atomic versions of bitfield macros

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/frratomic.h
lib/zebra.h

index 4ae84c401833bd3b194dbf9c6f926579fcd81af5..689b25255d9e41428a32fc65f54475a45f7062f6 100644 (file)
@@ -46,6 +46,8 @@
 #define atomic_exchange_explicit __atomic_exchange_n
 #define atomic_fetch_add_explicit __atomic_fetch_add
 #define atomic_fetch_sub_explicit __atomic_fetch_sub
+#define atomic_fetch_and_explicit __atomic_fetch_and
+#define atomic_fetch_or_explicit __atomic_fetch_or
 
 #define atomic_compare_exchange_weak_explicit(atom, expect, desire, mem1,      \
                                              mem2)                            \
                *_expect = rval;                                               \
                ret;                                                           \
        })
+#define atomic_fetch_and_explicit(ptr, val, mem)                               \
+       ({                                                                     \
+               __sync_synchronize();                                          \
+               typeof(*ptr) rval = __sync_fetch_and_and(ptr, val);            \
+               __sync_synchronize();                                          \
+               rval;                                                          \
+       })
+#define atomic_fetch_or_explicit(ptr, val, mem)                                \
+       ({                                                                     \
+               __sync_synchronize();                                          \
+               typeof(*ptr) rval = __sync_fetch_and_or(ptr, val);             \
+               __sync_synchronize();                                          \
+               rval;                                                          \
+       })
 
 #else /* !HAVE___ATOMIC && !HAVE_STDATOMIC_H */
 #error no atomic functions...
index 11bf764b630c549ffd6df48517fd50b5d0119028..e592118f69ea116267c2c65d69ed08449d27ff62 100644 (file)
@@ -481,6 +481,16 @@ typedef enum {
 #define UNSET_FLAG(V,F)      (V) &= ~(F)
 #define RESET_FLAG(V)        (V) = 0
 
+/* Atomic flag manipulation macros. */
+#define CHECK_FLAG_ATOMIC(PV, F)                                               \
+       ((atomic_load_explicit(PV, memory_order_seq_cst)) & (F))
+#define SET_FLAG_ATOMIC(PV, F)                                                 \
+       ((atomic_fetch_or_explicit(PV, (F), memory_order_seq_cst)))
+#define UNSET_FLAG_ATOMIC(PV, F)                                               \
+       ((atomic_fetch_and_explicit(PV, ~(F), memory_order_seq_cst)))
+#define RESET_FLAG_ATOMIC(PV)                                                  \
+       ((atomic_store_explicit(PV, 0, memory_order_seq_cst)))
+
 /* Zebra types. Used in Zserv message header. */
 typedef u_int16_t zebra_size_t;
 typedef u_int16_t zebra_command_t;