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