stdatomic.h (5680B)
1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #ifndef COMPAT_ATOMICS_WIN32_STDATOMIC_H 20 #define COMPAT_ATOMICS_WIN32_STDATOMIC_H 21 22 #include <stddef.h> 23 #include <stdint.h> 24 #include <windows.h> 25 26 #define ATOMIC_FLAG_INIT 0 27 28 #define ATOMIC_VAR_INIT(value) (value) 29 30 #define atomic_init(obj, value) \ 31 do { \ 32 *(obj) = (value); \ 33 } while(0) 34 35 #define kill_dependency(y) ((void)0) 36 37 #define atomic_thread_fence(order) \ 38 MemoryBarrier(); 39 40 #define atomic_signal_fence(order) \ 41 ((void)0) 42 43 #define atomic_is_lock_free(obj) 0 44 45 typedef intptr_t atomic_flag; 46 typedef intptr_t atomic_bool; 47 typedef intptr_t atomic_char; 48 typedef intptr_t atomic_schar; 49 typedef intptr_t atomic_uchar; 50 typedef intptr_t atomic_short; 51 typedef intptr_t atomic_ushort; 52 typedef intptr_t atomic_int; 53 typedef intptr_t atomic_uint; 54 typedef intptr_t atomic_long; 55 typedef intptr_t atomic_ulong; 56 typedef intptr_t atomic_llong; 57 typedef intptr_t atomic_ullong; 58 typedef intptr_t atomic_wchar_t; 59 typedef intptr_t atomic_int_least8_t; 60 typedef intptr_t atomic_uint_least8_t; 61 typedef intptr_t atomic_int_least16_t; 62 typedef intptr_t atomic_uint_least16_t; 63 typedef intptr_t atomic_int_least32_t; 64 typedef intptr_t atomic_uint_least32_t; 65 typedef intptr_t atomic_int_least64_t; 66 typedef intptr_t atomic_uint_least64_t; 67 typedef intptr_t atomic_int_fast8_t; 68 typedef intptr_t atomic_uint_fast8_t; 69 typedef intptr_t atomic_int_fast16_t; 70 typedef intptr_t atomic_uint_fast16_t; 71 typedef intptr_t atomic_int_fast32_t; 72 typedef intptr_t atomic_uint_fast32_t; 73 typedef intptr_t atomic_int_fast64_t; 74 typedef intptr_t atomic_uint_fast64_t; 75 typedef intptr_t atomic_intptr_t; 76 typedef intptr_t atomic_uintptr_t; 77 typedef intptr_t atomic_size_t; 78 typedef intptr_t atomic_ptrdiff_t; 79 typedef intptr_t atomic_intmax_t; 80 typedef intptr_t atomic_uintmax_t; 81 82 #define atomic_store(object, desired) \ 83 do { \ 84 *(object) = (desired); \ 85 MemoryBarrier(); \ 86 } while (0) 87 88 #define atomic_store_explicit(object, desired, order) \ 89 atomic_store(object, desired) 90 91 #define atomic_load(object) \ 92 (MemoryBarrier(), *(object)) 93 94 #define atomic_load_explicit(object, order) \ 95 atomic_load(object) 96 97 #define atomic_exchange(object, desired) \ 98 InterlockedExchangePointer((PVOID volatile *)object, (PVOID)desired) 99 100 #define atomic_exchange_explicit(object, desired, order) \ 101 atomic_exchange(object, desired) 102 103 static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected, 104 intptr_t desired) 105 { 106 intptr_t old = *expected; 107 *expected = (intptr_t)InterlockedCompareExchangePointer( 108 (PVOID *)object, (PVOID)desired, (PVOID)old); 109 return *expected == old; 110 } 111 112 #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ 113 atomic_compare_exchange_strong(object, expected, desired) 114 115 #define atomic_compare_exchange_weak(object, expected, desired) \ 116 atomic_compare_exchange_strong(object, expected, desired) 117 118 #define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ 119 atomic_compare_exchange_weak(object, expected, desired) 120 121 #ifdef _WIN64 122 #define atomic_fetch_add(object, operand) \ 123 InterlockedExchangeAdd64(object, operand) 124 125 #define atomic_fetch_sub(object, operand) \ 126 InterlockedExchangeAdd64(object, -(operand)) 127 128 #define atomic_fetch_or(object, operand) \ 129 InterlockedOr64(object, operand) 130 131 #define atomic_fetch_xor(object, operand) \ 132 InterlockedXor64(object, operand) 133 134 #define atomic_fetch_and(object, operand) \ 135 InterlockedAnd64(object, operand) 136 #else 137 #define atomic_fetch_add(object, operand) \ 138 InterlockedExchangeAdd(object, operand) 139 140 #define atomic_fetch_sub(object, operand) \ 141 InterlockedExchangeAdd(object, -(operand)) 142 143 #define atomic_fetch_or(object, operand) \ 144 InterlockedOr(object, operand) 145 146 #define atomic_fetch_xor(object, operand) \ 147 InterlockedXor(object, operand) 148 149 #define atomic_fetch_and(object, operand) \ 150 InterlockedAnd(object, operand) 151 #endif /* _WIN64 */ 152 153 #define atomic_fetch_add_explicit(object, operand, order) \ 154 atomic_fetch_add(object, operand) 155 156 #define atomic_fetch_sub_explicit(object, operand, order) \ 157 atomic_fetch_sub(object, operand) 158 159 #define atomic_fetch_or_explicit(object, operand, order) \ 160 atomic_fetch_or(object, operand) 161 162 #define atomic_fetch_xor_explicit(object, operand, order) \ 163 atomic_fetch_xor(object, operand) 164 165 #define atomic_fetch_and_explicit(object, operand, order) \ 166 atomic_fetch_and(object, operand) 167 168 #define atomic_flag_test_and_set(object) \ 169 atomic_exchange(object, 1) 170 171 #define atomic_flag_test_and_set_explicit(object, order) \ 172 atomic_flag_test_and_set(object) 173 174 #define atomic_flag_clear(object) \ 175 atomic_store(object, 0) 176 177 #define atomic_flag_clear_explicit(object, order) \ 178 atomic_flag_clear(object) 179 180 #endif /* COMPAT_ATOMICS_WIN32_STDATOMIC_H */