1 // Copyright (C) 2024 The Android Open Source Project 2 // SPDX-License-Identifier: BSD-2-Clause 3 4 #include <stdatomic.h> 5 6 #include "header_checks.h" 7 stdatomic_h()8static void stdatomic_h() { 9 TYPE(atomic_flag); 10 TYPE(atomic_bool); 11 TYPE(atomic_char); 12 TYPE(atomic_schar); 13 TYPE(atomic_uchar); 14 TYPE(atomic_short); 15 TYPE(atomic_ushort); 16 TYPE(atomic_int); 17 TYPE(atomic_uint); 18 TYPE(atomic_long); 19 TYPE(atomic_ulong); 20 TYPE(atomic_llong); 21 TYPE(atomic_ullong); 22 #if !defined(__GLIBC__) 23 TYPE(atomic_char16_t); 24 TYPE(atomic_char32_t); 25 #endif 26 TYPE(atomic_wchar_t); 27 TYPE(atomic_int_least8_t); 28 TYPE(atomic_uint_least8_t); 29 TYPE(atomic_int_least16_t); 30 TYPE(atomic_uint_least16_t); 31 TYPE(atomic_int_least32_t); 32 TYPE(atomic_uint_least32_t); 33 TYPE(atomic_int_least64_t); 34 TYPE(atomic_uint_least64_t); 35 TYPE(atomic_int_fast8_t); 36 TYPE(atomic_uint_fast8_t); 37 TYPE(atomic_int_fast16_t); 38 TYPE(atomic_uint_fast16_t); 39 TYPE(atomic_int_fast32_t); 40 TYPE(atomic_uint_fast32_t); 41 TYPE(atomic_int_fast64_t); 42 TYPE(atomic_uint_fast64_t); 43 TYPE(atomic_intptr_t); 44 TYPE(atomic_uintptr_t); 45 TYPE(atomic_size_t); 46 TYPE(atomic_ptrdiff_t); 47 TYPE(atomic_intmax_t); 48 TYPE(atomic_uintmax_t); 49 50 memory_order m1 = memory_order_relaxed; 51 memory_order m2 = memory_order_consume; 52 memory_order m3 = memory_order_acquire; 53 memory_order m4 = memory_order_release; 54 memory_order m5 = memory_order_acq_rel; 55 memory_order m6 = memory_order_seq_cst; 56 57 MACRO(ATOMIC_BOOL_LOCK_FREE); 58 MACRO(ATOMIC_CHAR_LOCK_FREE); 59 MACRO(ATOMIC_CHAR16_T_LOCK_FREE); 60 MACRO(ATOMIC_CHAR32_T_LOCK_FREE); 61 MACRO(ATOMIC_WCHAR_T_LOCK_FREE); 62 MACRO(ATOMIC_SHORT_LOCK_FREE); 63 MACRO(ATOMIC_INT_LOCK_FREE); 64 MACRO(ATOMIC_LONG_LOCK_FREE); 65 MACRO(ATOMIC_LLONG_LOCK_FREE); 66 MACRO(ATOMIC_POINTER_LOCK_FREE); 67 68 atomic_flag f = ATOMIC_FLAG_INIT; 69 70 // ATOMIC_VAR_INIT() has been removed from C23, 71 // but not from POSIX 2024. 72 atomic_int i = ATOMIC_VAR_INIT(123); 73 74 i = kill_dependency(i); 75 76 #if !defined(atomic_compare_exchange_strong) 77 #error atomic_compare_exchange_strong 78 #endif 79 #if !defined(atomic_compare_exchange_strong_explicit) 80 #error atomic_compare_exchange_strong_explicit 81 #endif 82 #if !defined(atomic_compare_exchange_weak) 83 #error atomic_compare_exchange_weak 84 #endif 85 #if !defined(atomic_compare_exchange_weak_explicit) 86 #error atomic_compare_exchange_weak_explicit 87 #endif 88 #if !defined(atomic_exchange) 89 #error atomic_exchange 90 #endif 91 #if !defined(atomic_exchange_explicit) 92 #error atomic_exchange_explicit 93 #endif 94 #if !defined(atomic_fetch_add) 95 #error atomic_fetch_add 96 #endif 97 #if !defined(atomic_fetch_add_explicit) 98 #error atomic_fetch_add_explicit 99 #endif 100 #if !defined(atomic_fetch_and) 101 #error atomic_fetch_and 102 #endif 103 #if !defined(atomic_fetch_and_explicit) 104 #error atomic_fetch_and_explicit 105 #endif 106 #if !defined(atomic_fetch_or) 107 #error atomic_fetch_or 108 #endif 109 #if !defined(atomic_fetch_or_explicit) 110 #error atomic_fetch_or_explicit 111 #endif 112 #if !defined(atomic_fetch_sub) 113 #error atomic_fetch_sub 114 #endif 115 #if !defined(atomic_fetch_sub_explicit) 116 #error atomic_fetch_sub_explicit 117 #endif 118 #if !defined(atomic_fetch_xor) 119 #error atomic_fetch_xor 120 #endif 121 #if !defined(atomic_fetch_xor_explicit) 122 #error atomic_fetch_xor_explicit 123 #endif 124 #if !defined(atomic_init) 125 #error atomic_init 126 #endif 127 #if !defined(atomic_is_lock_free) 128 #error atomic_is_lock_free 129 #endif 130 #if !defined(atomic_load) 131 #error atomic_load 132 #endif 133 #if !defined(atomic_load_explicit) 134 #error atomic_load_explicit 135 #endif 136 #if !defined(atomic_store) 137 #error atomic_store 138 #endif 139 #if !defined(atomic_store_explicit) 140 #error atomic_store_explicit 141 #endif 142 143 FUNCTION(atomic_flag_clear, void (*f)(volatile atomic_flag*)); 144 FUNCTION(atomic_flag_clear_explicit, void (*f)(volatile atomic_flag*, memory_order)); 145 FUNCTION(atomic_flag_test_and_set, bool (*f)(volatile atomic_flag*)); 146 FUNCTION(atomic_flag_test_and_set_explicit, bool (*f)(volatile atomic_flag*, memory_order)); 147 148 FUNCTION(atomic_signal_fence, void (*f)(memory_order)); 149 FUNCTION(atomic_thread_fence, void (*f)(memory_order)); 150 } 151