Home | History | Annotate | Line # | Download | only in isc
      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