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