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