| @@ -0,0 +1,197 @@ |
| | 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 | /* |
| | 20 | * based on vlc_atomic.h from VLC |
| | 21 | * Copyright (C) 2010 Rémi Denis-Courmont |
| | 22 | */ |
| | 23 | |
| | 24 | #ifndef FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H |
| | 25 | #define FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H |
| | 26 | |
| | 27 | #include <stdint.h> |
| | 28 | |
| | 29 | #define ATOMIC_FLAG_INIT 0 |
| | 30 | |
| | 31 | #define ATOMIC_VAR_INIT(value) (value) |
| | 32 | |
| | 33 | #define atomic_init(obj, value) \ |
| | 34 | do { \ |
| | 35 | *(obj) = (value); \ |
| | 36 | } while(0) |
| | 37 | |
| | 38 | #define kill_dependency(y) ((void)0) |
| | 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 | void avpriv_atomic_lock(void); |
| | 83 | void avpriv_atomic_unlock(void); |
| | 84 | |
| | 85 | static inline void atomic_thread_fence(int order) |
| | 86 | { |
| | 87 | avpriv_atomic_lock(); |
| | 88 | avpriv_atomic_unlock(); |
| | 89 | } |
| | 90 | |
| | 91 | static inline void atomic_store(intptr_t *object, intptr_t desired) |
| | 92 | { |
| | 93 | avpriv_atomic_lock(); |
| | 94 | *object = desired; |
| | 95 | avpriv_atomic_unlock(); |
| | 96 | } |
| | 97 | |
| | 98 | #define atomic_store_explicit(object, desired, order) \ |
| | 99 | atomic_store(object, desired) |
| | 100 | |
| | 101 | static inline intptr_t atomic_load(intptr_t *object) |
| | 102 | { |
| | 103 | intptr_t ret; |
| | 104 | avpriv_atomic_lock(); |
| | 105 | ret = *object; |
| | 106 | avpriv_atomic_unlock(); |
| | 107 | return ret; |
| | 108 | } |
| | 109 | |
| | 110 | #define atomic_load_explicit(object, order) \ |
| | 111 | atomic_load(object) |
| | 112 | |
| | 113 | static inline intptr_t atomic_exchange(intptr_t *object, intptr_t desired) |
| | 114 | { |
| | 115 | intptr_t ret; |
| | 116 | avpriv_atomic_lock(); |
| | 117 | ret = *object; |
| | 118 | *object = desired; |
| | 119 | avpriv_atomic_unlock(); |
| | 120 | return ret; |
| | 121 | } |
| | 122 | |
| | 123 | #define atomic_exchange_explicit(object, desired, order) \ |
| | 124 | atomic_exchange(object, desired) |
| | 125 | |
| | 126 | static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected, |
| | 127 | intptr_t desired) |
| | 128 | { |
| | 129 | int ret; |
| | 130 | avpriv_atomic_lock(); |
| | 131 | if (*object == *expected) { |
| | 132 | ret = 1; |
| | 133 | *object = desired; |
| | 134 | } else { |
| | 135 | ret = 0; |
| | 136 | *expected = *object; |
| | 137 | } |
| | 138 | avpriv_atomic_unlock(); |
| | 139 | return ret; |
| | 140 | } |
| | 141 | |
| | 142 | #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ |
| | 143 | atomic_compare_exchange_strong(object, expected, desired) |
| | 144 | |
| | 145 | #define atomic_compare_exchange_weak(object, expected, desired) \ |
| | 146 | atomic_compare_exchange_strong(object, expected, desired) |
| | 147 | |
| | 148 | #define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ |
| | 149 | atomic_compare_exchange_weak(object, expected, desired) |
| | 150 | |
| | 151 | #define FETCH_MODIFY(opname, op) \ |
| | 152 | static inline intptr_t atomic_fetch_ ## opname(intptr_t *object, intptr_t operand) \ |
| | 153 | { \ |
| | 154 | intptr_t ret; \ |
| | 155 | avpriv_atomic_lock(); \ |
| | 156 | ret = *object; \ |
| | 157 | *object = *object op operand; \ |
| | 158 | avpriv_atomic_unlock(); \ |
| | 159 | return ret; \ |
| | 160 | } |
| | 161 | |
| | 162 | FETCH_MODIFY(add, +) |
| | 163 | FETCH_MODIFY(sub, -) |
| | 164 | FETCH_MODIFY(or, |) |
| | 165 | FETCH_MODIFY(xor, ^) |
| | 166 | FETCH_MODIFY(and, &) |
| | 167 | |
| | 168 | #undef FETCH_MODIFY |
| | 169 | |
| | 170 | #define atomic_fetch_add_explicit(object, operand, order) \ |
| | 171 | atomic_fetch_add(object, operand) |
| | 172 | |
| | 173 | #define atomic_fetch_sub_explicit(object, operand, order) \ |
| | 174 | atomic_fetch_sub(object, operand) |
| | 175 | |
| | 176 | #define atomic_fetch_or_explicit(object, operand, order) \ |
| | 177 | atomic_fetch_or(object, operand) |
| | 178 | |
| | 179 | #define atomic_fetch_xor_explicit(object, operand, order) \ |
| | 180 | atomic_fetch_sub(object, operand) |
| | 181 | |
| | 182 | #define atomic_fetch_and_explicit(object, operand, order) \ |
| | 183 | atomic_fetch_and(object, operand) |
| | 184 | |
| | 185 | #define atomic_flag_test_and_set(object) \ |
| | 186 | atomic_exchange(object, 1) |
| | 187 | |
| | 188 | #define atomic_flag_test_and_set_explicit(object, order) \ |
| | 189 | atomic_flag_test_and_set(object) |
| | 190 | |
| | 191 | #define atomic_flag_clear(object) \ |
| | 192 | atomic_store(object, 0) |
| | 193 | |
| | 194 | #define atomic_flag_clear_explicit(object, order) \ |
| | 195 | atomic_flag_clear(object) |
| | 196 | |
| | 197 | #endif /* FFMPEG_COMPAT_ATOMICS_PTHREAD_STDATOMIC_H */ |