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