19#ifndef COMPAT_ATOMICS_DUMMY_STDATOMIC_IMPL_H
20#define COMPAT_ATOMICS_DUMMY_STDATOMIC_IMPL_H
24#define FF_ATOMIC_LOCK_FREE 0
25#define FF_ATOMIC_ALIGN64
27#define ff_atomic_thread_fence(order) \
30#define ff_atomic_signal_fence(order) \
39#define DUMMY_ATOMIC_FETCH(op, OP, name, type) \
40static av_always_inline type ff_atomic_##op##name(volatile void *object, \
44 type old = ff_atomic_load##name(object, order); \
45 ff_atomic_store##name(object, old OP operand, order); \
49#define DUMMY_ATOMIC_OPS(name, type) \
50static av_always_inline type \
51ff_atomic_load_##name(const volatile void *object, memory_order order) \
55 memcpy(&v, (const void *)object, sizeof(v)); \
59static av_always_inline void ff_atomic_store_##name(volatile void *object, \
64 memcpy((void *)object, &desired, sizeof(desired)); \
67static av_always_inline type ff_atomic_exchange_##name(volatile void *object, \
71 type old = ff_atomic_load_##name(object, order); \
72 ff_atomic_store_##name(object, desired, order); \
76static av_always_inline bool ff_atomic_cas_##name(volatile void *object, \
81 type old = ff_atomic_load_##name(object, order); \
82 if (old == ff_atomic_load_##name(expected, order)) { \
83 ff_atomic_store_##name(object, desired, order); \
86 ff_atomic_store_##name(expected, old, order); \
90DUMMY_ATOMIC_FETCH(fetch_add, +, _##name, type) \
91DUMMY_ATOMIC_FETCH(fetch_sub, -, _##name, type) \
92DUMMY_ATOMIC_FETCH(fetch_or, |, _##name, type) \
93DUMMY_ATOMIC_FETCH(fetch_xor, ^, _##name, type) \
94DUMMY_ATOMIC_FETCH(fetch_and, &, _##name, type)
103#undef DUMMY_ATOMIC_OPS
104#undef DUMMY_ATOMIC_FETCH
#define DUMMY_ATOMIC_OPS(name, type)