diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h index 8bae46e2545..5162f5d3c63 100644 --- a/include/llvm/System/Atomic.h +++ b/include/llvm/System/Atomic.h @@ -44,24 +44,27 @@ namespace llvm { #if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0 typedef unsigned long cas_flag; - inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) { - cas_flag result = *dest; + template + inline T CompareAndSwap(volatile T* dest, + T exc, T c) { + T result = *dest; if (result == c) *dest = exc; return result; } #elif defined(__GNUC__) typedef unsigned long cas_flag; - inline cas_flag CompareAndSwap(cas_flag* ptr, - cas_flag new_value, - cas_flag old_value) { + template + inline T CompareAndSwap(volatile T* ptr, + T new_value, + T old_value) { return __sync_val_compare_and_swap(ptr, old_value, new_value); } -#elif defined(_MSC_VER) && _M_IX86 > 400 +#elif defined(_MSC_VER) typedef LONG cas_flag; - inline cas_flag CompareAndSwap(cas_flag* ptr, - cas_flag new_value, - cas_flag old_value) { + inline T CompareAndSwap(volatile T* ptr, + T new_value, + T old_value) { return InterlockedCompareExchange(addr, new_value, old_value); } #else