1 /* 2 * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 3 * 4 * SPDX-License-Identifier: MPL-2.0 5 * 6 * This Source Code Form is subject to the terms of the Mozilla Public 7 * License, v. 2.0. If a copy of the MPL was not distributed with this 8 * file, you can obtain one at https://mozilla.org/MPL/2.0/. 9 * 10 * See the COPYRIGHT file distributed with this work for additional 11 * information regarding copyright ownership. 12 */ 13 14 #pragma once 15 16 #ifdef ISC_MUTEX_ATOMICS 17 #include <isc/mutexatomic.h> 18 #else /* ifdef ISC_MUTEX_ATOMICS */ 19 #if HAVE_STDATOMIC_H 20 #include <stdatomic.h> 21 #else /* if HAVE_STDATOMIC_H */ 22 #include <isc/stdatomic.h> 23 #endif /* if HAVE_STDATOMIC_H */ 24 #endif /* ifdef ISC_MUTEX_ATOMICS */ 25 26 /* 27 * We define a few additional macros to make things easier 28 */ 29 30 /* Relaxed Memory Ordering */ 31 32 #define atomic_store_relaxed(o, v) \ 33 atomic_store_explicit((o), (v), memory_order_relaxed) 34 #define atomic_load_relaxed(o) atomic_load_explicit((o), memory_order_relaxed) 35 #define atomic_fetch_add_relaxed(o, v) \ 36 atomic_fetch_add_explicit((o), (v), memory_order_relaxed) 37 #define atomic_fetch_sub_relaxed(o, v) \ 38 atomic_fetch_sub_explicit((o), (v), memory_order_relaxed) 39 #define atomic_fetch_or_relaxed(o, v) \ 40 atomic_fetch_or_explicit((o), (v), memory_order_relaxed) 41 #define atomic_fetch_and_relaxed(o, v) \ 42 atomic_fetch_and_explicit((o), (v), memory_order_relaxed) 43 #define atomic_exchange_relaxed(o, v) \ 44 atomic_exchange_explicit((o), (v), memory_order_relaxed) 45 #define atomic_compare_exchange_weak_relaxed(o, e, d) \ 46 atomic_compare_exchange_weak_explicit( \ 47 (o), (e), (d), memory_order_relaxed, memory_order_relaxed) 48 #define atomic_compare_exchange_strong_relaxed(o, e, d) \ 49 atomic_compare_exchange_strong_explicit( \ 50 (o), (e), (d), memory_order_relaxed, memory_order_relaxed) 51 #define atomic_compare_exchange_strong_acq_rel(o, e, d) \ 52 atomic_compare_exchange_strong_explicit( \ 53 (o), (e), (d), memory_order_acq_rel, memory_order_acquire) 54 55 /* Acquire-Release Memory Ordering */ 56 57 #define atomic_store_release(o, v) \ 58 atomic_store_explicit((o), (v), memory_order_release) 59 #define atomic_load_acquire(o) atomic_load_explicit((o), memory_order_acquire) 60 #define atomic_fetch_add_release(o, v) \ 61 atomic_fetch_add_explicit((o), (v), memory_order_release) 62 #define atomic_fetch_sub_release(o, v) \ 63 atomic_fetch_sub_explicit((o), (v), memory_order_release) 64 #define atomic_fetch_and_release(o, v) \ 65 atomic_fetch_and_explicit((o), (v), memory_order_release) 66 #define atomic_fetch_or_release(o, v) \ 67 atomic_fetch_or_explicit((o), (v), memory_order_release) 68 #define atomic_exchange_acq_rel(o, v) \ 69 atomic_exchange_explicit((o), (v), memory_order_acq_rel) 70 #define atomic_fetch_sub_acq_rel(o, v) \ 71 atomic_fetch_sub_explicit((o), (v), memory_order_acq_rel) 72 #define atomic_compare_exchange_weak_acq_rel(o, e, d) \ 73 atomic_compare_exchange_weak_explicit( \ 74 (o), (e), (d), memory_order_acq_rel, memory_order_acquire) 75 #define atomic_compare_exchange_strong_acq_rel(o, e, d) \ 76 atomic_compare_exchange_strong_explicit( \ 77 (o), (e), (d), memory_order_acq_rel, memory_order_acquire) 78