diff --git a/compat/atomics/win32/stdatomic.h b/compat/atomics/win32/stdatomic.h index 28a627bfd3d..32abf8ea02e 100644 --- a/compat/atomics/win32/stdatomic.h +++ b/compat/atomics/win32/stdatomic.h @@ -101,14 +101,15 @@ 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) \ + (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) 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); } }