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