+#define atomic_get_64(n, a) do { \
+ (n) = atomic_add_64_ov(a, 0); \
+} while (0)
+#endif /* __LP64__ */
+
+#define atomic_test_set_ptr(a, o, n) \
+ OSCompareAndSwapPtr(o, n, (void * volatile *)a)
+
+#define atomic_set_ptr(a, n) do { \
+ while (!atomic_test_set_ptr(a, *a, n)) \
+ ; \
+} while (0)
+
+#define atomic_or_8_ov(a, n) \
+ ((u_int8_t) OSBitOrAtomic8(n, (volatile UInt8 *)a))
+
+#define atomic_or_8(a, n) \
+ ((void) atomic_or_8_ov(a, n))
+
+#define atomic_bitset_8(a, n) \
+ atomic_or_8(a, n)
+
+#define atomic_or_16_ov(a, n) \
+ ((u_int16_t) OSBitOrAtomic16(n, (volatile UInt16 *)a))
+
+#define atomic_or_16(a, n) \
+ ((void) atomic_or_16_ov(a, n))
+
+#define atomic_bitset_16(a, n) \
+ atomic_or_16(a, n)
+
+#define atomic_or_32_ov(a, n) \
+ ((u_int32_t) OSBitOrAtomic(n, (volatile UInt32 *)a))
+
+#define atomic_or_32(a, n) \
+ ((void) atomic_or_32_ov(a, n))
+
+#define atomic_bitset_32(a, n) \
+ atomic_or_32(a, n)
+
+#define atomic_and_8_ov(a, n) \
+ ((u_int8_t) OSBitAndAtomic8(n, (volatile UInt8 *)a))
+
+#define atomic_and_8(a, n) \
+ ((void) atomic_and_8_ov(a, n))
+
+#define atomic_bitclear_8(a, n) \
+ atomic_and_8(a, ~(n))
+
+#define atomic_and_16_ov(a, n) \
+ ((u_int16_t) OSBitAndAtomic16(n, (volatile UInt16 *)a))
+
+#define atomic_and_16(a, n) \
+ ((void) atomic_and_16_ov(a, n))
+
+#define atomic_bitclear_16(a, n) \
+ atomic_and_16(a, ~(n))
+
+#define atomic_and_32_ov(a, n) \
+ ((u_int32_t) OSBitAndAtomic(n, (volatile UInt32 *)a))
+
+#define atomic_and_32(a, n) \
+ ((void) atomic_and_32_ov(a, n))
+
+#define atomic_bitclear_32(a, n) \
+ atomic_and_32(a, ~(n))
+
+#define membar_sync OSMemoryBarrier
+
+/*
+ * Use CPU_CACHE_LINE_SIZE instead of MAX_CPU_CACHE_LINE_SIZE, unless
+ * wasting space is of no concern.
+ */
+#define MAX_CPU_CACHE_LINE_SIZE 128
+#define CPU_CACHE_LINE_SIZE mcache_cache_line_size()