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_SUNCC_STDATOMIC_H 20#define COMPAT_ATOMICS_SUNCC_STDATOMIC_H 21 22#include <atomic.h> 23#include <mbarrier.h> 24#include <stddef.h> 25#include <stdint.h> 26 27#define ATOMIC_FLAG_INIT 0 28 29#define ATOMIC_VAR_INIT(value) (value) 30 31#define atomic_init(obj, value) \ 32do { \ 33 *(obj) = (value); \ 34} while(0) 35 36#define kill_dependency(y) ((void)0) 37 38#define atomic_thread_fence(order) \ 39 __machine_rw_barrier(); 40 41#define atomic_signal_fence(order) \ 42 ((void)0) 43 44#define atomic_is_lock_free(obj) 0 45 46typedef intptr_t atomic_flag; 47typedef intptr_t atomic_bool; 48typedef intptr_t atomic_char; 49typedef intptr_t atomic_schar; 50typedef intptr_t atomic_uchar; 51typedef intptr_t atomic_short; 52typedef intptr_t atomic_ushort; 53typedef intptr_t atomic_int; 54typedef intptr_t atomic_uint; 55typedef intptr_t atomic_long; 56typedef intptr_t atomic_ulong; 57typedef intptr_t atomic_llong; 58typedef intptr_t atomic_ullong; 59typedef intptr_t atomic_wchar_t; 60typedef intptr_t atomic_int_least8_t; 61typedef intptr_t atomic_uint_least8_t; 62typedef intptr_t atomic_int_least16_t; 63typedef intptr_t atomic_uint_least16_t; 64typedef intptr_t atomic_int_least32_t; 65typedef intptr_t atomic_uint_least32_t; 66typedef intptr_t atomic_int_least64_t; 67typedef intptr_t atomic_uint_least64_t; 68typedef intptr_t atomic_int_fast8_t; 69typedef intptr_t atomic_uint_fast8_t; 70typedef intptr_t atomic_int_fast16_t; 71typedef intptr_t atomic_uint_fast16_t; 72typedef intptr_t atomic_int_fast32_t; 73typedef intptr_t atomic_uint_fast32_t; 74typedef intptr_t atomic_int_fast64_t; 75typedef intptr_t atomic_uint_fast64_t; 76typedef intptr_t atomic_intptr_t; 77typedef intptr_t atomic_uintptr_t; 78typedef intptr_t atomic_size_t; 79typedef intptr_t atomic_ptrdiff_t; 80typedef intptr_t atomic_intmax_t; 81typedef intptr_t atomic_uintmax_t; 82 83static inline void atomic_store(intptr_t *object, intptr_t desired) 84{ 85 *object = desired; 86 __machine_rw_barrier(); 87} 88 89#define atomic_store_explicit(object, desired, order) \ 90 atomic_store(object, desired) 91 92static inline intptr_t atomic_load(intptr_t *object) 93{ 94 __machine_rw_barrier(); 95 return *object; 96} 97 98#define atomic_load_explicit(object, order) \ 99 atomic_load(object) 100 101#define atomic_exchange(object, desired) \ 102 atomic_swap_ptr(object, desired) 103 104#define atomic_exchange_explicit(object, desired, order) \ 105 atomic_exchange(object, desired) 106 107static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected, 108 intptr_t desired) 109{ 110 intptr_t old = *expected; 111 *expected = (intptr_t)atomic_cas_ptr(object, (void *)old, (void *)desired); 112 return *expected == old; 113} 114 115#define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ 116 atomic_compare_exchange_strong(object, expected, desired) 117 118#define atomic_compare_exchange_weak(object, expected, desired) \ 119 atomic_compare_exchange_strong(object, expected, desired) 120 121#define atomic_compare_exchange_weak_explicit(object, expected, desired, success, failure) \ 122 atomic_compare_exchange_weak(object, expected, desired) 123 124static inline intptr_t atomic_fetch_add(intptr_t *object, intptr_t operand) 125{ 126 return atomic_add_ptr_nv(object, operand) - operand; 127} 128 129#define atomic_fetch_sub(object, operand) \ 130 atomic_fetch_add(object, -(operand)) 131 132static inline intptr_t atomic_fetch_or(intptr_t *object, intptr_t operand) 133{ 134 intptr_t old; 135 do { 136 old = atomic_load(object); 137 } while (!atomic_compare_exchange_strong(object, old, old | operand)); 138 return old; 139} 140 141static inline intptr_t atomic_fetch_xor(intptr_t *object, intptr_t operand) 142{ 143 intptr_t old; 144 do { 145 old = atomic_load(object); 146 } while (!atomic_compare_exchange_strong(object, old, old ^ operand)); 147 return old; 148} 149 150static inline intptr_t atomic_fetch_and(intptr_t *object, intptr_t operand) 151{ 152 intptr_t old; 153 do { 154 old = atomic_load(object); 155 } while (!atomic_compare_exchange_strong(object, old, old & operand)); 156 return old; 157} 158 159#define atomic_fetch_add_explicit(object, operand, order) \ 160 atomic_fetch_add(object, operand) 161 162#define atomic_fetch_sub_explicit(object, operand, order) \ 163 atomic_fetch_sub(object, operand) 164 165#define atomic_fetch_or_explicit(object, operand, order) \ 166 atomic_fetch_or(object, operand) 167 168#define atomic_fetch_xor_explicit(object, operand, order) \ 169 atomic_fetch_xor(object, operand) 170 171#define atomic_fetch_and_explicit(object, operand, order) \ 172 atomic_fetch_and(object, operand) 173 174#define atomic_flag_test_and_set(object) \ 175 atomic_exchange(object, 1) 176 177#define atomic_flag_test_and_set_explicit(object, order) \ 178 atomic_flag_test_and_set(object) 179 180#define atomic_flag_clear(object) \ 181 atomic_store(object, 0) 182 183#define atomic_flag_clear_explicit(object, order) \ 184 atomic_flag_clear(object) 185 186#endif /* COMPAT_ATOMICS_SUNCC_STDATOMIC_H */ 187