atomicops_unittest.cc revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/atomicops.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestAtomicIncrement() { 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // For now, we just test single threaded execution 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // use a guard value to make sure the NoBarrier_AtomicIncrement doesn't go 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // outside the expected address bounds. This is in particular to 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // test that some future change to the asm code doesn't cause the 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 32-bit NoBarrier_AtomicIncrement doesn't do the wrong thing on 64-bit 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // machines. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct { 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType prev_word; 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType count; 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType next_word; 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } s; 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType prev_word_value, next_word_value; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&prev_word_value, 0xFF, sizeof(AtomicType)); 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&next_word_value, 0xEE, sizeof(AtomicType)); 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s.prev_word = prev_word_value; 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s.count = 0; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott s.next_word = next_word_value; 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 1), 1); 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 1); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 2), 3); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 3); 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 3), 6); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 6); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -3), 3); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 3); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -2), 1); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 1); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -1), 0); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 0); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -1), -1); 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, -1); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -4), -5); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, -5); 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 5), 0); 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.count, 0); 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.prev_word, prev_word_value); 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(s.next_word, next_word_value); 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NUM_BITS(T) (sizeof(T) * 8) 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestCompareAndSwap() { 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType value = 0; 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 1); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, value); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, prev); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use test value that has non-zero bits in both halves, more for testing 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 64-bit implementation on 32-bit platforms. 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType k_test_val = (GG_ULONGLONG(1) << 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (NUM_BITS(AtomicType) - 2)) + 11; 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = k_test_val; 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 5); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, value); 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, prev); 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = k_test_val; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott prev = base::subtle::NoBarrier_CompareAndSwap(&value, k_test_val, 5); 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5, value); 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, prev); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestAtomicExchange() { 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType value = 0; 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType new_value = base::subtle::NoBarrier_AtomicExchange(&value, 1); 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, value); 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(0, new_value); 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Use test value that has non-zero bits in both halves, more for testing 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 64-bit implementation on 32-bit platforms. 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType k_test_val = (GG_ULONGLONG(1) << 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (NUM_BITS(AtomicType) - 2)) + 11; 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = k_test_val; 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott new_value = base::subtle::NoBarrier_AtomicExchange(&value, k_test_val); 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, value); 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, new_value); 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = k_test_val; 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott new_value = base::subtle::NoBarrier_AtomicExchange(&value, 5); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(5, value); 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(k_test_val, new_value); 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestAtomicIncrementBounds() { 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test at rollover boundary between int_max and int_min 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType test_val = (GG_ULONGLONG(1) << 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott (NUM_BITS(AtomicType) - 1)); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType value = -1 ^ test_val; 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1); 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(test_val, value); 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(value, new_value); 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::NoBarrier_AtomicIncrement(&value, -1); 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(-1 ^ test_val, value); 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test at 32-bit boundary for 64-bit atomic type. 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott test_val = GG_ULONGLONG(1) << (NUM_BITS(AtomicType) / 2); 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = test_val - 1; 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1); 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(test_val, value); 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(value, new_value); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::NoBarrier_AtomicIncrement(&value, -1); 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(test_val - 1, value); 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Return an AtomicType with the value 0xa5a5a5.. 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic AtomicType TestFillValue() { 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType val = 0; 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(&val, 0xa5, sizeof(AtomicType)); 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return val; 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is a simple sanity check that values are correct. Not testing 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// atomicity 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestStore() { 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType kVal1 = TestFillValue<AtomicType>(); 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType kVal2 = static_cast<AtomicType>(-1); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType value; 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::NoBarrier_Store(&value, kVal1); 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, value); 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::NoBarrier_Store(&value, kVal2); 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, value); 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::Acquire_Store(&value, kVal1); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, value); 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::Acquire_Store(&value, kVal2); 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, value); 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::Release_Store(&value, kVal1); 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, value); 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott base::subtle::Release_Store(&value, kVal2); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, value); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is a simple sanity check that values are correct. Not testing 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// atomicity 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class AtomicType> 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic void TestLoad() { 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType kVal1 = TestFillValue<AtomicType>(); 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const AtomicType kVal2 = static_cast<AtomicType>(-1); 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott AtomicType value; 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal1; 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, base::subtle::NoBarrier_Load(&value)); 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal2; 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, base::subtle::NoBarrier_Load(&value)); 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal1; 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, base::subtle::Acquire_Load(&value)); 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal2; 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, base::subtle::Acquire_Load(&value)); 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal1; 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal1, base::subtle::Release_Load(&value)); 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott value = kVal2; 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(kVal2, base::subtle::Release_Load(&value)); 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, Inc) { 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicIncrement<base::subtle::Atomic32>(); 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicIncrement<base::subtle::AtomicWord>(); 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, CompareAndSwap) { 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompareAndSwap<base::subtle::Atomic32>(); 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompareAndSwap<base::subtle::AtomicWord>(); 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, Exchange) { 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicExchange<base::subtle::Atomic32>(); 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicExchange<base::subtle::AtomicWord>(); 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, IncrementBounds) { 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicIncrementBounds<base::subtle::Atomic32>(); 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestAtomicIncrementBounds<base::subtle::AtomicWord>(); 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, Store) { 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestStore<base::subtle::Atomic32>(); 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestStore<base::subtle::AtomicWord>(); 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(AtomicOpsTest, Load) { 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestLoad<base::subtle::Atomic32>(); 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestLoad<base::subtle::AtomicWord>(); 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 238