sanitizer_atomic_test.cc revision b037f754eb43ddd2c5401ff7c7b212b57f8f4eb6
1//===-- sanitizer_atomic_test.cc ------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file is a part of ThreadSanitizer/AddressSanitizer runtime. 11// 12//===----------------------------------------------------------------------===// 13#include "sanitizer_common/sanitizer_atomic.h" 14#include "gtest/gtest.h" 15 16namespace __sanitizer { 17 18// Clang crashes while compiling this test for Android: 19// http://llvm.org/bugs/show_bug.cgi?id=15587 20#if !SANITIZER_ANDROID 21template<typename T> 22void CheckAtomicCompareExchange() { 23 typedef typename T::Type Type; 24 { 25 Type old_val = 42; 26 Type new_val = 24; 27 Type var = old_val; 28 EXPECT_TRUE(atomic_compare_exchange_strong((T*)&var, &old_val, new_val, 29 memory_order_relaxed)); 30 EXPECT_FALSE(atomic_compare_exchange_strong((T*)&var, &old_val, new_val, 31 memory_order_relaxed)); 32 EXPECT_EQ(new_val, old_val); 33 } 34 { 35 Type old_val = 42; 36 Type new_val = 24; 37 Type var = old_val; 38 EXPECT_TRUE(atomic_compare_exchange_weak((T*)&var, &old_val, new_val, 39 memory_order_relaxed)); 40 EXPECT_FALSE(atomic_compare_exchange_weak((T*)&var, &old_val, new_val, 41 memory_order_relaxed)); 42 EXPECT_EQ(new_val, old_val); 43 } 44} 45 46TEST(SanitizerCommon, AtomicCompareExchangeTest) { 47 CheckAtomicCompareExchange<atomic_uint8_t>(); 48 CheckAtomicCompareExchange<atomic_uint16_t>(); 49 CheckAtomicCompareExchange<atomic_uint32_t>(); 50 CheckAtomicCompareExchange<atomic_uint64_t>(); 51 CheckAtomicCompareExchange<atomic_uintptr_t>(); 52} 53#endif //!SANITIZER_ANDROID 54 55} // namespace __sanitizer 56