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_GCC_STDATOMIC_H 25cabdff1aSopenharmony_ci#define COMPAT_ATOMICS_GCC_STDATOMIC_H 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include <stddef.h> 28cabdff1aSopenharmony_ci#include <stdint.h> 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#define ATOMIC_FLAG_INIT 0 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define ATOMIC_VAR_INIT(value) (value) 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define atomic_init(obj, value) \ 35cabdff1aSopenharmony_cido { \ 36cabdff1aSopenharmony_ci *(obj) = (value); \ 37cabdff1aSopenharmony_ci} while(0) 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_ci#define kill_dependency(y) ((void)0) 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define atomic_thread_fence(order) \ 42cabdff1aSopenharmony_ci __sync_synchronize() 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci#define atomic_signal_fence(order) \ 45cabdff1aSopenharmony_ci ((void)0) 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci#define atomic_is_lock_free(obj) 0 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_citypedef _Bool atomic_flag; 50cabdff1aSopenharmony_citypedef _Bool atomic_bool; 51cabdff1aSopenharmony_citypedef char atomic_char; 52cabdff1aSopenharmony_citypedef signed char atomic_schar; 53cabdff1aSopenharmony_citypedef unsigned char atomic_uchar; 54cabdff1aSopenharmony_citypedef short atomic_short; 55cabdff1aSopenharmony_citypedef unsigned short atomic_ushort; 56cabdff1aSopenharmony_citypedef int atomic_int; 57cabdff1aSopenharmony_citypedef unsigned int atomic_uint; 58cabdff1aSopenharmony_citypedef long atomic_long; 59cabdff1aSopenharmony_citypedef unsigned long atomic_ulong; 60cabdff1aSopenharmony_citypedef long long atomic_llong; 61cabdff1aSopenharmony_citypedef unsigned long long atomic_ullong; 62cabdff1aSopenharmony_citypedef wchar_t atomic_wchar_t; 63cabdff1aSopenharmony_citypedef int_least8_t atomic_int_least8_t; 64cabdff1aSopenharmony_citypedef uint_least8_t atomic_uint_least8_t; 65cabdff1aSopenharmony_citypedef int_least16_t atomic_int_least16_t; 66cabdff1aSopenharmony_citypedef uint_least16_t atomic_uint_least16_t; 67cabdff1aSopenharmony_citypedef int_least32_t atomic_int_least32_t; 68cabdff1aSopenharmony_citypedef uint_least32_t atomic_uint_least32_t; 69cabdff1aSopenharmony_citypedef int_least64_t atomic_int_least64_t; 70cabdff1aSopenharmony_citypedef uint_least64_t atomic_uint_least64_t; 71cabdff1aSopenharmony_citypedef int_fast8_t atomic_int_fast8_t; 72cabdff1aSopenharmony_citypedef uint_fast8_t atomic_uint_fast8_t; 73cabdff1aSopenharmony_citypedef int_fast16_t atomic_int_fast16_t; 74cabdff1aSopenharmony_citypedef uint_fast16_t atomic_uint_fast16_t; 75cabdff1aSopenharmony_citypedef int_fast32_t atomic_int_fast32_t; 76cabdff1aSopenharmony_citypedef uint_fast32_t atomic_uint_fast32_t; 77cabdff1aSopenharmony_citypedef int_fast64_t atomic_int_fast64_t; 78cabdff1aSopenharmony_citypedef uint_fast64_t atomic_uint_fast64_t; 79cabdff1aSopenharmony_citypedef intptr_t atomic_intptr_t; 80cabdff1aSopenharmony_citypedef uintptr_t atomic_uintptr_t; 81cabdff1aSopenharmony_citypedef size_t atomic_size_t; 82cabdff1aSopenharmony_citypedef ptrdiff_t atomic_ptrdiff_t; 83cabdff1aSopenharmony_citypedef intmax_t atomic_intmax_t; 84cabdff1aSopenharmony_citypedef uintmax_t atomic_uintmax_t; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci#define atomic_store(object, desired) \ 87cabdff1aSopenharmony_cido { \ 88cabdff1aSopenharmony_ci *(object) = (desired); \ 89cabdff1aSopenharmony_ci __sync_synchronize(); \ 90cabdff1aSopenharmony_ci} while (0) 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci#define atomic_store_explicit(object, desired, order) \ 93cabdff1aSopenharmony_ci atomic_store(object, desired) 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci#define atomic_load(object) \ 96cabdff1aSopenharmony_ci (__sync_synchronize(), *(object)) 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci#define atomic_load_explicit(object, order) \ 99cabdff1aSopenharmony_ci atomic_load(object) 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci#define atomic_exchange(object, desired) \ 102cabdff1aSopenharmony_ci({ \ 103cabdff1aSopenharmony_ci __typeof__(object) _obj = (object); \ 104cabdff1aSopenharmony_ci __typeof__(*object) _old; \ 105cabdff1aSopenharmony_ci do \ 106cabdff1aSopenharmony_ci _old = atomic_load(_obj); \ 107cabdff1aSopenharmony_ci while (!__sync_bool_compare_and_swap(_obj, _old, (desired))); \ 108cabdff1aSopenharmony_ci _old; \ 109cabdff1aSopenharmony_ci}) 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci#define atomic_exchange_explicit(object, desired, order) \ 112cabdff1aSopenharmony_ci atomic_exchange(object, desired) 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci#define atomic_compare_exchange_strong(object, expected, desired) \ 115cabdff1aSopenharmony_ci({ \ 116cabdff1aSopenharmony_ci __typeof__(object) _exp = (expected); \ 117cabdff1aSopenharmony_ci __typeof__(*object) _old = *_exp; \ 118cabdff1aSopenharmony_ci *_exp = __sync_val_compare_and_swap((object), _old, (desired)); \ 119cabdff1aSopenharmony_ci *_exp == _old; \ 120cabdff1aSopenharmony_ci}) 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci#define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ 123cabdff1aSopenharmony_ci atomic_compare_exchange_strong(object, expected, desired) 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci#define atomic_compare_exchange_weak(object, expected, desired) \ 126cabdff1aSopenharmony_ci atomic_compare_exchange_strong(object, expected, desired) 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ 129cabdff1aSopenharmony_ci atomic_compare_exchange_weak(object, expected, desired) 130cabdff1aSopenharmony_ci 131cabdff1aSopenharmony_ci#define atomic_fetch_add(object, operand) \ 132cabdff1aSopenharmony_ci __sync_fetch_and_add(object, operand) 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci#define atomic_fetch_add_explicit(object, operand, order) \ 135cabdff1aSopenharmony_ci atomic_fetch_add(object, operand) 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci#define atomic_fetch_sub(object, operand) \ 138cabdff1aSopenharmony_ci __sync_fetch_and_sub(object, operand) 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci#define atomic_fetch_sub_explicit(object, operand, order) \ 141cabdff1aSopenharmony_ci atomic_fetch_sub(object, operand) 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci#define atomic_fetch_or(object, operand) \ 144cabdff1aSopenharmony_ci __sync_fetch_and_or(object, operand) 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci#define atomic_fetch_or_explicit(object, operand, order) \ 147cabdff1aSopenharmony_ci atomic_fetch_or(object, operand) 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci#define atomic_fetch_xor(object, operand) \ 150cabdff1aSopenharmony_ci __sync_fetch_and_xor(object, operand) 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci#define atomic_fetch_xor_explicit(object, operand, order) \ 153cabdff1aSopenharmony_ci atomic_fetch_xor(object, operand) 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci#define atomic_fetch_and(object, operand) \ 156cabdff1aSopenharmony_ci __sync_fetch_and_and(object, operand) 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci#define atomic_fetch_and_explicit(object, operand, order) \ 159cabdff1aSopenharmony_ci atomic_fetch_and(object, operand) 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci#define atomic_flag_test_and_set(object) \ 162cabdff1aSopenharmony_ci atomic_exchange(object, 1) 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci#define atomic_flag_test_and_set_explicit(object, order) \ 165cabdff1aSopenharmony_ci atomic_flag_test_and_set(object) 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_ci#define atomic_flag_clear(object) \ 168cabdff1aSopenharmony_ci atomic_store(object, 0) 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci#define atomic_flag_clear_explicit(object, order) \ 171cabdff1aSopenharmony_ci atomic_flag_clear(object) 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci#endif /* COMPAT_ATOMICS_GCC_STDATOMIC_H */ 174