]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
add atomic_exchange operations to mutexatomic.h and win32 stdatomic.h
authorWitold Kręcicki <wpk@isc.org>
Thu, 24 Oct 2019 08:55:54 +0000 (10:55 +0200)
committerEvan Hunt <each@isc.org>
Thu, 7 Nov 2019 19:55:37 +0000 (11:55 -0800)
lib/isc/include/isc/mutexatomic.h
lib/isc/unix/include/isc/stdatomic.h
lib/isc/win32/include/isc/stdatomic.h

index c111081ee9c665ba582c0dd889cfb5afa6cafc17..94d899882257e54522220596c0e90a95bb553560 100644 (file)
@@ -93,6 +93,11 @@ typedef struct atomic_uint_fast64 {
        uint64_t v;
 } atomic_uint_fast64_t;
 
+typedef struct atomic_uintptr {
+       isc_mutex_t m;
+       uintptr_t v;
+} atomic_uintptr_t;
+
 typedef struct atomic_bool_s {
        isc_mutex_t m;
        bool v;
@@ -198,3 +203,14 @@ typedef struct atomic_bool_s {
        atomic_compare_exchange_weak_explicit(obj, expected, desired, \
                                              memory_order_seq_cst,   \
                                              memory_order_seq_cst)
+#define atomic_exchange_explicit(obj, desired, order)                  \
+       ({                                                              \
+               typeof((obj)->v) ___v;                                  \
+               REQUIRE(isc_mutex_lock(&(obj)->m) == ISC_R_SUCCESS);    \
+               ___v = (obj)->v;                                        \
+               (obj)->v = desired;                                     \
+               REQUIRE(isc_mutex_unlock(&(obj)->m) == ISC_R_SUCCESS);  \
+               ___v;                                                   \
+       })
+#define atomic_exchange(obj, desired) \
+       atomic_exchange_explicit(obj, desired, memory_order_seq_cst)
index f0909d232b2d59d41c402f5f1babf46fff182df1..8e423a961bf700f10fde3297ac65ed7c33974ed7 100644 (file)
@@ -80,6 +80,8 @@ typedef int_fast64_t  atomic_int_fast64_t;
 typedef uint_fast64_t  atomic_uint_fast64_t;
 typedef bool           atomic_bool;
 
+typedef uint_fast64_t  atomic_uintptr_t;
+
 #if defined(__CLANG_ATOMICS) /* __c11_atomic builtins */
 #define atomic_init(obj, desired)              \
        __c11_atomic_init(obj, desired)
@@ -99,6 +101,8 @@ typedef bool         atomic_bool;
        __c11_atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)
 #define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
        __c11_atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)
+#define atomic_exchange_explicit(obj, desired, order)  \
+       __c11_atomic_exchange_explicit(obj, expected, order)
 #elif defined(__GNUC_ATOMICS) /* __atomic builtins */
 #define atomic_init(obj, desired)                      \
        (*obj = desired)
@@ -118,6 +122,8 @@ typedef bool                atomic_bool;
        __atomic_compare_exchange_n(obj, expected, desired, 0, succ, fail)
 #define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
        __atomic_compare_exchange_n(obj, expected, desired, 1, succ, fail)
+#define atomic_exchange_explicit(obj, desired, order)  \
+       __atomic_exchange_n(obj, desired, order)
 #else /* __sync builtins */
 #define atomic_init(obj, desired)                      \
        (*obj = desired)
@@ -150,6 +156,9 @@ typedef bool                atomic_bool;
        })
 #define atomic_compare_exchange_weak_explicit(obj, expected, desired, succ, fail)      \
        atomic_compare_exchange_strong_explicit(obj, expected, desired, succ, fail)
+#define atomic_exchange_explicit(obj, desired, order) \
+       __sync_lock_test_and_set(obj, desired)
+
 #endif
 
 #define atomic_load(obj) \
@@ -168,3 +177,5 @@ typedef bool                atomic_bool;
        atomic_compare_exchange_strong_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
 #define atomic_compare_exchange_weak(obj, expected, desired)   \
        atomic_compare_exchange_weak_explicit(obj, expected, desired, memory_order_seq_cst, memory_order_seq_cst)
+#define atomic_exchange(obj, desired)  \
+       atomic_exchange_explicit(obj, desired, memory_order_seq_cst)
index 62c2de14beef6cac12f712386671912c228a384d..60ac199af29a7a34afc3fa4b2b4d16b669fa1d1f 100644 (file)
@@ -397,8 +397,7 @@ atomic_compare_exchange_strong_explicit64(atomic_int_fast64_t *obj,
        return (__r);
 }
 
-static inline
-bool
+static inline bool
 atomic_compare_exchange_abort() {
        INSIST(0);
        ISC_UNREACHABLE();
@@ -434,3 +433,23 @@ atomic_compare_exchange_abort() {
        atomic_compare_exchange_weak_explicit(obj, expected, desired,   \
                                              memory_order_seq_cst,     \
                                              memory_order_seq_cst)
+
+static inline
+bool
+atomic_exchange_abort() {
+       INSIST(0);
+       ISC_UNREACHABLE();
+}
+
+
+#define atomic_exchange_explicit(obj, desired, order)  \
+       (sizeof(*(obj)) == 8                            \
+        ? InterlockedExchange64(obj, desired)          \
+        : (sizeof(*(obj)) == 4                         \
+           ? InterlockedExchange(obj, desired)         \
+               : (sizeof(*(obj)) == 1                  \
+               ? InterlockedExchange8(obj, desired)    \
+                   : atomic_exchange_abort())))
+
+#define atomic_exchange(obj, desired)                                  \
+       atomic_exchange_explicit(obj, desired, memory_order_seq_cst)    \