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;
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)
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)
__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)
__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)
})
#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) \
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)
return (__r);
}
-static inline
-bool
+static inline bool
atomic_compare_exchange_abort() {
INSIST(0);
ISC_UNREACHABLE();
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) \