atomic.h revision 1.1 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