mirror of
https://github.com/mpv-player/mpv
synced 2025-03-11 08:37:59 +00:00
atomic: remove __atomic builtin usage
Using these was a temporary solution while some compilers implemented the underlying atomic mechanisms, but not the C11 language parts (or that's what I guess). Not really useful for us anymore. Also, there is the slight risk of having subtly incorrect semantics by using potentially changing compiler internals and such.
This commit is contained in:
parent
3739d1318f
commit
81efe20cd7
@ -27,15 +27,14 @@
|
||||
#else
|
||||
|
||||
// Emulate the parts of C11 stdatomic.h needed by mpv.
|
||||
// Still relies on gcc/clang atomic builtins.
|
||||
|
||||
typedef struct { volatile unsigned long v; } atomic_ulong;
|
||||
typedef struct { volatile int v; } atomic_int;
|
||||
typedef struct { volatile unsigned int v; } atomic_uint;
|
||||
typedef struct { volatile _Bool v; } atomic_bool;
|
||||
typedef struct { volatile long long v; } atomic_llong;
|
||||
typedef struct { volatile uint_least32_t v; } atomic_uint_least32_t;
|
||||
typedef struct { volatile unsigned long long v; } atomic_ullong;
|
||||
typedef struct { unsigned long v; } atomic_ulong;
|
||||
typedef struct { int v; } atomic_int;
|
||||
typedef struct { unsigned int v; } atomic_uint;
|
||||
typedef struct { _Bool v; } atomic_bool;
|
||||
typedef struct { long long v; } atomic_llong;
|
||||
typedef struct { uint_least32_t v; } atomic_uint_least32_t;
|
||||
typedef struct { unsigned long long v; } atomic_ullong;
|
||||
|
||||
#define ATOMIC_VAR_INIT(x) \
|
||||
{.v = (x)}
|
||||
@ -45,24 +44,6 @@ typedef struct { volatile unsigned long long v; } atomic_ullong;
|
||||
|
||||
#define atomic_load_explicit(p, e) atomic_load(p)
|
||||
|
||||
#if HAVE_ATOMIC_BUILTINS
|
||||
|
||||
#define atomic_load(p) \
|
||||
__atomic_load_n(&(p)->v, __ATOMIC_SEQ_CST)
|
||||
#define atomic_store(p, val) \
|
||||
__atomic_store_n(&(p)->v, val, __ATOMIC_SEQ_CST)
|
||||
#define atomic_fetch_add(a, b) \
|
||||
__atomic_fetch_add(&(a)->v, b, __ATOMIC_SEQ_CST)
|
||||
#define atomic_fetch_and(a, b) \
|
||||
__atomic_fetch_and(&(a)->v, b, __ATOMIC_SEQ_CST)
|
||||
#define atomic_fetch_or(a, b) \
|
||||
__atomic_fetch_or(&(a)->v, b, __ATOMIC_SEQ_CST)
|
||||
#define atomic_compare_exchange_strong(a, b, c) \
|
||||
__atomic_compare_exchange_n(&(a)->v, b, c, 0, __ATOMIC_SEQ_CST, \
|
||||
__ATOMIC_SEQ_CST)
|
||||
|
||||
#elif defined(__GNUC__)
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
extern pthread_mutex_t mp_atomic_mutex;
|
||||
@ -104,10 +85,6 @@ extern pthread_mutex_t mp_atomic_mutex;
|
||||
pthread_mutex_unlock(&mp_atomic_mutex); \
|
||||
res; })
|
||||
|
||||
#else
|
||||
# error "this should have been a configuration error, report a bug please"
|
||||
#endif /* no atomics */
|
||||
|
||||
#endif /* else HAVE_STDATOMIC */
|
||||
|
||||
#endif
|
||||
|
@ -74,7 +74,7 @@ static const char def_config[] =
|
||||
#define FULLCONFIG "(missing)\n"
|
||||
#endif
|
||||
|
||||
#if !(HAVE_STDATOMIC || HAVE_ATOMIC_BUILTINS || HAVE_SYNC_BUILTINS)
|
||||
#if !HAVE_STDATOMIC
|
||||
pthread_mutex_t mp_atomic_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
#endif
|
||||
|
||||
|
12
wscript
12
wscript
@ -170,20 +170,12 @@ main_dependencies = [
|
||||
check_statement('stdatomic.h',
|
||||
'atomic_int_least64_t test = ATOMIC_VAR_INIT(123);'
|
||||
'atomic_fetch_add(&test, 1)'))
|
||||
}, {
|
||||
'name': 'atomic-builtins',
|
||||
'desc': 'compiler support for __atomic built-ins',
|
||||
'func': check_libs(['atomic'],
|
||||
check_statement('stdint.h',
|
||||
'int64_t test = 0;'
|
||||
'test = __atomic_add_fetch(&test, 1, __ATOMIC_SEQ_CST)')),
|
||||
'deps_neg': [ 'stdatomic' ],
|
||||
}, {
|
||||
'name': 'atomics',
|
||||
'desc': 'stdatomic.h support or emulation',
|
||||
'desc': 'stdatomic.h support or slow emulation',
|
||||
'func': check_true,
|
||||
'req': True,
|
||||
'deps_any': ['stdatomic', 'atomic-builtins', 'gnuc'],
|
||||
'deps_any': ['stdatomic', 'gnuc'],
|
||||
}, {
|
||||
'name': 'c11-tls',
|
||||
'desc': 'C11 TLS support',
|
||||
|
Loading…
Reference in New Issue
Block a user