aboutsummaryrefslogtreecommitdiffstats
path: root/compat/atomics/win32
diff options
context:
space:
mode:
authorWan-Teh Chang <wtc@google.com>2016-12-02 16:56:16 -0800
committerVittorio Giovara <vittorio.giovara@gmail.com>2016-12-08 15:53:58 -0500
commit6a93b596c5c3af31b843d63013a7985ffeea354d (patch)
tree023ffd3b217ea2541f3f1bd71440d2d6a93c63c4 /compat/atomics/win32
parent2170017a1cd033b6f28e16476921022712a522d8 (diff)
downloadffmpeg-6a93b596c5c3af31b843d63013a7985ffeea354d.tar.gz
compat/atomics: add typecasts in atomic_compare_exchange_strong()
The Solaris and Windows emulations of atomic_compare_exchange_strong() need typecasts to avoid compiler warnings, because the functions they call expect a void* pointer but an intptr_t integer is passed. Note that the emulations of atomic_compare_exchange_strong() (except the gcc version) only work for atomic_intptr_t because of the type of the second argument (|expected|). See http://en.cppreference.com/w/c/atomic: _Bool atomic_compare_exchange_strong( volatile A* obj, C* expected, C desired ); The types of the first argument and second argument are different (|A| and |C|, respectively). |C| is the non-atomic type corresponding to |A|. In the emulations of atomic_compare_exchange_strong(), |C| is intptr_t. This implies |A| can only be sig_intptr_t. Signed-off-by: Wan-Teh Chang <wtc@google.com>
Diffstat (limited to 'compat/atomics/win32')
-rw-r--r--compat/atomics/win32/stdatomic.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/compat/atomics/win32/stdatomic.h b/compat/atomics/win32/stdatomic.h
index bdd39337a3..9cfdaa523f 100644
--- a/compat/atomics/win32/stdatomic.h
+++ b/compat/atomics/win32/stdatomic.h
@@ -104,7 +104,8 @@ static inline int atomic_compare_exchange_strong(intptr_t *object, intptr_t *exp
intptr_t desired)
{
intptr_t old = *expected;
- *expected = InterlockedCompareExchangePointer(object, desired, old);
+ *expected = (intptr_t)InterlockedCompareExchangePointer(
+ (PVOID *)object, (PVOID)desired, (PVOID)old);
return *expected == old;
}