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 COMPAT_ATOMICS_PTHREAD_STDATOMIC_H 25#define 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) \ 34do { \ 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 45typedef intptr_t atomic_flag; 46typedef intptr_t atomic_bool; 47typedef intptr_t atomic_char; 48typedef intptr_t atomic_schar; 49typedef intptr_t atomic_uchar; 50typedef intptr_t atomic_short; 51typedef intptr_t atomic_ushort; 52typedef intptr_t atomic_int; 53typedef intptr_t atomic_uint; 54typedef intptr_t atomic_long; 55typedef intptr_t atomic_ulong; 56typedef intptr_t atomic_llong; 57typedef intptr_t atomic_ullong; 58typedef intptr_t atomic_wchar_t; 59typedef intptr_t atomic_int_least8_t; 60typedef intptr_t atomic_uint_least8_t; 61typedef intptr_t atomic_int_least16_t; 62typedef intptr_t atomic_uint_least16_t; 63typedef intptr_t atomic_int_least32_t; 64typedef intptr_t atomic_uint_least32_t; 65typedef intptr_t atomic_int_least64_t; 66typedef intptr_t atomic_uint_least64_t; 67typedef intptr_t atomic_int_fast8_t; 68typedef intptr_t atomic_uint_fast8_t; 69typedef intptr_t atomic_int_fast16_t; 70typedef intptr_t atomic_uint_fast16_t; 71typedef intptr_t atomic_int_fast32_t; 72typedef intptr_t atomic_uint_fast32_t; 73typedef intptr_t atomic_int_fast64_t; 74typedef intptr_t atomic_uint_fast64_t; 75typedef intptr_t atomic_intptr_t; 76typedef intptr_t atomic_uintptr_t; 77typedef intptr_t atomic_size_t; 78typedef intptr_t atomic_ptrdiff_t; 79typedef intptr_t atomic_intmax_t; 80typedef intptr_t atomic_uintmax_t; 81 82void avpriv_atomic_lock(void); 83void avpriv_atomic_unlock(void); 84 85static inline void atomic_thread_fence(int order) 86{ 87 avpriv_atomic_lock(); 88 avpriv_atomic_unlock(); 89} 90 91static 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 101static 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 113static 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 126static 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) \ 152static 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 162FETCH_MODIFY(add, +) 163FETCH_MODIFY(sub, -) 164FETCH_MODIFY(or, |) 165FETCH_MODIFY(xor, ^) 166FETCH_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_xor(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 /* COMPAT_ATOMICS_PTHREAD_STDATOMIC_H */ 198