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