OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdio.h> | 5 #include <stdio.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <algorithm> // for min() | 7 #include <algorithm> // for min() |
| 8 |
8 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
10 | 11 |
11 // Number of bits in a size_t. | 12 // Number of bits in a size_t. |
12 static const int kSizeBits = 8 * sizeof(size_t); | 13 static const int kSizeBits = 8 * sizeof(size_t); |
13 // The maximum size of a size_t. | 14 // The maximum size of a size_t. |
14 static const size_t kMaxSize = ~static_cast<size_t>(0); | 15 static const size_t kMaxSize = ~static_cast<size_t>(0); |
15 // Maximum positive size of a size_t if it were signed. | 16 // Maximum positive size of a size_t if it were signed. |
16 static const size_t kMaxSignedSize = ((size_t(1) << (kSizeBits-1)) - 1); | 17 static const size_t kMaxSignedSize = ((size_t(1) << (kSizeBits-1)) - 1); |
17 // An allocation size which is not too big to be reasonable. | 18 // An allocation size which is not too big to be reasonable. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 if (size == power-1) | 75 if (size == power-1) |
75 return power; | 76 return power; |
76 | 77 |
77 assert(size == power); | 78 assert(size == power); |
78 return power+1; | 79 return power+1; |
79 } else { | 80 } else { |
80 return -1; | 81 return -1; |
81 } | 82 } |
82 } | 83 } |
83 | 84 |
84 #define GG_ULONGLONG(x) static_cast<uint64>(x) | |
85 | |
86 template <class AtomicType> | 85 template <class AtomicType> |
87 static void TestAtomicIncrement() { | 86 static void TestAtomicIncrement() { |
88 // For now, we just test single threaded execution | 87 // For now, we just test single threaded execution |
89 | 88 |
90 // use a guard value to make sure the NoBarrier_AtomicIncrement doesn't go | 89 // use a guard value to make sure the NoBarrier_AtomicIncrement doesn't go |
91 // outside the expected address bounds. This is in particular to | 90 // outside the expected address bounds. This is in particular to |
92 // test that some future change to the asm code doesn't cause the | 91 // test that some future change to the asm code doesn't cause the |
93 // 32-bit NoBarrier_AtomicIncrement to do the wrong thing on 64-bit machines. | 92 // 32-bit NoBarrier_AtomicIncrement to do the wrong thing on 64-bit machines. |
94 struct { | 93 struct { |
95 AtomicType prev_word; | 94 AtomicType prev_word; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 | 156 |
158 template <class AtomicType> | 157 template <class AtomicType> |
159 static void TestCompareAndSwap() { | 158 static void TestCompareAndSwap() { |
160 AtomicType value = 0; | 159 AtomicType value = 0; |
161 AtomicType prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 1); | 160 AtomicType prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 1); |
162 EXPECT_EQ(1, value); | 161 EXPECT_EQ(1, value); |
163 EXPECT_EQ(0, prev); | 162 EXPECT_EQ(0, prev); |
164 | 163 |
165 // Use test value that has non-zero bits in both halves, more for testing | 164 // Use test value that has non-zero bits in both halves, more for testing |
166 // 64-bit implementation on 32-bit platforms. | 165 // 64-bit implementation on 32-bit platforms. |
167 const AtomicType k_test_val = (GG_ULONGLONG(1) << | 166 const AtomicType k_test_val = (static_cast<uint64_t>(1) << |
168 (NUM_BITS(AtomicType) - 2)) + 11; | 167 (NUM_BITS(AtomicType) - 2)) + 11; |
169 value = k_test_val; | 168 value = k_test_val; |
170 prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 5); | 169 prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 5); |
171 EXPECT_EQ(k_test_val, value); | 170 EXPECT_EQ(k_test_val, value); |
172 EXPECT_EQ(k_test_val, prev); | 171 EXPECT_EQ(k_test_val, prev); |
173 | 172 |
174 value = k_test_val; | 173 value = k_test_val; |
175 prev = base::subtle::NoBarrier_CompareAndSwap(&value, k_test_val, 5); | 174 prev = base::subtle::NoBarrier_CompareAndSwap(&value, k_test_val, 5); |
176 EXPECT_EQ(5, value); | 175 EXPECT_EQ(5, value); |
177 EXPECT_EQ(k_test_val, prev); | 176 EXPECT_EQ(k_test_val, prev); |
178 } | 177 } |
179 | 178 |
180 | 179 |
181 template <class AtomicType> | 180 template <class AtomicType> |
182 static void TestAtomicExchange() { | 181 static void TestAtomicExchange() { |
183 AtomicType value = 0; | 182 AtomicType value = 0; |
184 AtomicType new_value = base::subtle::NoBarrier_AtomicExchange(&value, 1); | 183 AtomicType new_value = base::subtle::NoBarrier_AtomicExchange(&value, 1); |
185 EXPECT_EQ(1, value); | 184 EXPECT_EQ(1, value); |
186 EXPECT_EQ(0, new_value); | 185 EXPECT_EQ(0, new_value); |
187 | 186 |
188 // Use test value that has non-zero bits in both halves, more for testing | 187 // Use test value that has non-zero bits in both halves, more for testing |
189 // 64-bit implementation on 32-bit platforms. | 188 // 64-bit implementation on 32-bit platforms. |
190 const AtomicType k_test_val = (GG_ULONGLONG(1) << | 189 const AtomicType k_test_val = (static_cast<uint64_t>(1) << |
191 (NUM_BITS(AtomicType) - 2)) + 11; | 190 (NUM_BITS(AtomicType) - 2)) + 11; |
192 value = k_test_val; | 191 value = k_test_val; |
193 new_value = base::subtle::NoBarrier_AtomicExchange(&value, k_test_val); | 192 new_value = base::subtle::NoBarrier_AtomicExchange(&value, k_test_val); |
194 EXPECT_EQ(k_test_val, value); | 193 EXPECT_EQ(k_test_val, value); |
195 EXPECT_EQ(k_test_val, new_value); | 194 EXPECT_EQ(k_test_val, new_value); |
196 | 195 |
197 value = k_test_val; | 196 value = k_test_val; |
198 new_value = base::subtle::NoBarrier_AtomicExchange(&value, 5); | 197 new_value = base::subtle::NoBarrier_AtomicExchange(&value, 5); |
199 EXPECT_EQ(5, value); | 198 EXPECT_EQ(5, value); |
200 EXPECT_EQ(k_test_val, new_value); | 199 EXPECT_EQ(k_test_val, new_value); |
201 } | 200 } |
202 | 201 |
203 | 202 |
204 template <class AtomicType> | 203 template <class AtomicType> |
205 static void TestAtomicIncrementBounds() { | 204 static void TestAtomicIncrementBounds() { |
206 // Test increment at the half-width boundary of the atomic type. | 205 // Test increment at the half-width boundary of the atomic type. |
207 // It is primarily for testing at the 32-bit boundary for 64-bit atomic type. | 206 // It is primarily for testing at the 32-bit boundary for 64-bit atomic type. |
208 AtomicType test_val = GG_ULONGLONG(1) << (NUM_BITS(AtomicType) / 2); | 207 AtomicType test_val = static_cast<uint64_t>(1) << (NUM_BITS(AtomicType) / 2); |
209 AtomicType value = test_val - 1; | 208 AtomicType value = test_val - 1; |
210 AtomicType new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1); | 209 AtomicType new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1); |
211 EXPECT_EQ(test_val, value); | 210 EXPECT_EQ(test_val, value); |
212 EXPECT_EQ(value, new_value); | 211 EXPECT_EQ(value, new_value); |
213 | 212 |
214 base::subtle::NoBarrier_AtomicIncrement(&value, -1); | 213 base::subtle::NoBarrier_AtomicIncrement(&value, -1); |
215 EXPECT_EQ(test_val - 1, value); | 214 EXPECT_EQ(test_val - 1, value); |
216 } | 215 } |
217 | 216 |
218 // This is a simple sanity check that values are correct. Not testing | 217 // This is a simple sanity check that values are correct. Not testing |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 } | 511 } |
513 } | 512 } |
514 | 513 |
515 #endif | 514 #endif |
516 | 515 |
517 | 516 |
518 int main(int argc, char** argv) { | 517 int main(int argc, char** argv) { |
519 testing::InitGoogleTest(&argc, argv); | 518 testing::InitGoogleTest(&argc, argv); |
520 return RUN_ALL_TESTS(); | 519 return RUN_ALL_TESTS(); |
521 } | 520 } |
OLD | NEW |