vlc | branch: master | Felix Abecassis <[email protected]> | Fri Nov 29 17:41:33 2013 +0100| [9c077c0d28df2ad7387b4db8702bd023b2556c86] | committer: Jean-Baptiste Kempf
Implement atomic operations for MSVC using the Interlocked API. Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9c077c0d28df2ad7387b4db8702bd023b2556c86 --- include/vlc_atomic.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/include/vlc_atomic.h b/include/vlc_atomic.h index 5905a73..49cc1ae 100644 --- a/include/vlc_atomic.h +++ b/include/vlc_atomic.h @@ -302,6 +302,86 @@ typedef uintmax_t atomic_uintmax_t; # define atomic_flag_clear_explicit(object,order) \ atomic_flag_clear(object) +# elif defined (_MSC_VER) + +/*** Use the Interlocked API. ***/ + +/* Define macros in order to dispatch to the correct function depending on the type. + Several ranges are need because some operations are not implemented for all types. */ +# define atomic_type_dispatch_32_64(operation, object, ...) \ + (sizeof(*object) == 4 ? operation(object, __VA_ARGS__) : \ + sizeof(*object) == 8 ? operation##64(object, __VA_ARGS__) : \ + (abort(), 0)) + +# define atomic_type_dispatch_16_64(operation, object, ...) \ + (sizeof(*object) == 2 ? operation##16(object, __VA_ARGS__) : \ + atomic_type_dispatch_32_64(operation, object, __VA_ARGS__)) + +# define atomic_type_dispatch_8_64(operation, object, ...) \ + (sizeof(*object) == 1 ? operation##8(object, __VA_ARGS__) : \ + atomic_type_dispatch_16_64(operation, object, __VA_ARGS__)) + +# define atomic_store(object,desired) \ + atomic_type_dispatch_8_64(InterlockedExchange, object, desired) +# define atomic_store_explicit(object,desired,order) \ + atomic_store(object, desired) + +# define atomic_load(object) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, 0, 0) +# define atomic_load_explicit(object,order) \ + atomic_load(object) + +# define atomic_exchange(object,desired) \ + atomic_type_dispatch_8_64(InterlockedExchange, object, desired) +# define atomic_exchange_explicit(object,desired,order) \ + atomic_exchange(object, desired) + +# define atomic_compare_exchange_strong(object,expected,desired) \ + atomic_type_dispatch_16_64(InterlockedCompareExchange, object, expected, desired) == expected +# define atomic_compare_exchange_strong_explicit(object,expected,desired,order) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak(object,expected,desired) \ + atomic_compare_exchange_strong(object, expected, desired) +# define atomic_compare_exchange_weak_explicit(object,expected,desired,order) \ + atomic_compare_exchange_weak(object, expected, desired) + +# define atomic_fetch_add(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, operand) +# define atomic_fetch_add_explicit(object,operand,order) \ + atomic_fetch_add(object, operand) + +# define atomic_fetch_sub(object,operand) \ + atomic_type_dispatch_32_64(InterlockedExchangeAdd, object, -operand) +# define atomic_fetch_sub_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_or(object,operand) \ + atomic_type_dispatch_8_64(InterlockedOr, object, operand) +# define atomic_fetch_or_explicit(object,operand,order) \ + atomic_fetch_or(object, operand) + +# define atomic_fetch_xor(object,operand) \ + atomic_type_dispatch_8_64(InterlockedXor, object, operand) +# define atomic_fetch_xor_explicit(object,operand,order) \ + atomic_fetch_sub(object, operand) + +# define atomic_fetch_and(object,operand) \ + atomic_type_dispatch_8_64(InterlockedAnd, object, operand) +# define atomic_fetch_and_explicit(object,operand,order) \ + atomic_fetch_and(object, operand) + +# define atomic_flag_test_and_set(object) \ + atomic_exchange(object, true) + +# define atomic_flag_test_and_set_explicit(object,order) \ + atomic_flag_test_and_set(object) + +# define atomic_flag_clear(object) \ + atomic_store(object, false) + +# define atomic_flag_clear_explicit(object,order) \ + atomic_flag_clear(object) + # else # error FIXME: implement atomic operations for this compiler. # endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
