From c41db7eb5d38286ff6548483dea478e8c15175b7 Mon Sep 17 00:00:00 2001 From: Frank Plowman Date: Mon, 3 Apr 2023 10:20:50 +0100 Subject: [PATCH 1/2] Change win32 compat `atomic_compare_exchange_strong` to match C11 spec * Change `atomic_compare_exchange_strong` to macro, so it may take an atomic first argument and non-atomic second argument, as in the C11 specification * Remove OS-dependent code in `libavcodec/vcc_thread.c` --- compat/atomics/win32/stdatomic.h | 10 ++-------- libavcodec/vvc_thread.c | 4 ---- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/compat/atomics/win32/stdatomic.h b/compat/atomics/win32/stdatomic.h index 28a627bfd3d..9297aef9d18 100644 --- a/compat/atomics/win32/stdatomic.h +++ b/compat/atomics/win32/stdatomic.h @@ -101,14 +101,8 @@ do { \ #define atomic_exchange_explicit(object, desired, order) \ atomic_exchange(object, desired) -static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *expected, - intptr_t desired) -{ - intptr_t old = *expected; - *expected = (intptr_t)InterlockedCompareExchangePointer( - (PVOID *)object, (PVOID)desired, (PVOID)old); - return *expected == old; -} +#define atomic_compare_exchange_strong(object, expected, desired) \ + (InterlockedCompareExchangePointer((PVOID *) object, (PVOID) desired, *((PVOID *) expected)) == *((PVOID *) expected)) #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ atomic_compare_exchange_strong(object, expected, desired) diff --git a/libavcodec/vvc_thread.c b/libavcodec/vvc_thread.c index a22617e394d..29ed5c1e8bf 100644 --- a/libavcodec/vvc_thread.c +++ b/libavcodec/vvc_thread.c @@ -569,11 +569,7 @@ int ff_vvc_task_run(Task *_t, void *local_context, void *user_data) if (!atomic_load(&ft->ret)) { if ((ret = run[t->type](s, lc, t)) < 0) { -#ifdef WIN32 - intptr_t zero = 0; -#else int zero = 0; -#endif atomic_compare_exchange_strong(&ft->ret, &zero, ret); } } From dabc841044a3b43ccb8184158b36a943a9db755f Mon Sep 17 00:00:00 2001 From: Frank Plowman Date: Mon, 3 Apr 2023 13:57:50 +0100 Subject: [PATCH 2/2] Select fixed-size `InterlockedCompareExchange` based on object size --- compat/atomics/win32/stdatomic.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compat/atomics/win32/stdatomic.h b/compat/atomics/win32/stdatomic.h index 9297aef9d18..32abf8ea02e 100644 --- a/compat/atomics/win32/stdatomic.h +++ b/compat/atomics/win32/stdatomic.h @@ -101,8 +101,15 @@ do { \ #define atomic_exchange_explicit(object, desired, order) \ atomic_exchange(object, desired) -#define atomic_compare_exchange_strong(object, expected, desired) \ - (InterlockedCompareExchangePointer((PVOID *) object, (PVOID) desired, *((PVOID *) expected)) == *((PVOID *) expected)) +#define atomic_compare_exchange_strong(object, expected, desired) \ + (sizeof(*object) == 2 ? \ + InterlockedCompareExchange16((SHORT *) object, (SHORT) desired, *((SHORT *) expected)) == *expected \ + : sizeof(*object) == 4 ? \ + InterlockedCompareExchange((LONG *) object, (LONG) desired, *((LONG *) expected)) == *expected \ + : sizeof(*object) == 8 ? \ + InterlockedCompareExchange64((LONG64 *) object, (LONG64) desired, *((LONG64 *) expected)) == *expected \ + : 0) + #define atomic_compare_exchange_strong_explicit(object, expected, desired, success, failure) \ atomic_compare_exchange_strong(object, expected, desired)