OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/task_scheduler/scheduler_lock.h" | 5 #include "base/task_scheduler/scheduler_lock.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 lock.Release(); | 124 lock.Release(); |
125 predecessor.Release(); | 125 predecessor.Release(); |
126 } | 126 } |
127 | 127 |
128 TEST(TaskSchedulerLock, AcquirePredecessorWrongOrder) { | 128 TEST(TaskSchedulerLock, AcquirePredecessorWrongOrder) { |
129 SchedulerLock predecessor; | 129 SchedulerLock predecessor; |
130 SchedulerLock lock(&predecessor); | 130 SchedulerLock lock(&predecessor); |
131 EXPECT_DCHECK_DEATH({ | 131 EXPECT_DCHECK_DEATH({ |
132 lock.Acquire(); | 132 lock.Acquire(); |
133 predecessor.Acquire(); | 133 predecessor.Acquire(); |
134 }, ""); | 134 }); |
135 } | 135 } |
136 | 136 |
137 TEST(TaskSchedulerLock, AcquireNonPredecessor) { | 137 TEST(TaskSchedulerLock, AcquireNonPredecessor) { |
138 SchedulerLock lock1; | 138 SchedulerLock lock1; |
139 SchedulerLock lock2; | 139 SchedulerLock lock2; |
140 EXPECT_DCHECK_DEATH({ | 140 EXPECT_DCHECK_DEATH({ |
141 lock1.Acquire(); | 141 lock1.Acquire(); |
142 lock2.Acquire(); | 142 lock2.Acquire(); |
143 }, ""); | 143 }); |
144 } | 144 } |
145 | 145 |
146 TEST(TaskSchedulerLock, AcquireMultipleLocksInOrder) { | 146 TEST(TaskSchedulerLock, AcquireMultipleLocksInOrder) { |
147 SchedulerLock lock1; | 147 SchedulerLock lock1; |
148 SchedulerLock lock2(&lock1); | 148 SchedulerLock lock2(&lock1); |
149 SchedulerLock lock3(&lock2); | 149 SchedulerLock lock3(&lock2); |
150 lock1.Acquire(); | 150 lock1.Acquire(); |
151 lock2.Acquire(); | 151 lock2.Acquire(); |
152 lock3.Acquire(); | 152 lock3.Acquire(); |
153 lock3.Release(); | 153 lock3.Release(); |
(...skipping 11 matching lines...) Expand all Loading... |
165 lock2.Release(); | 165 lock2.Release(); |
166 } | 166 } |
167 | 167 |
168 TEST(TaskSchedulerLock, AcquireMultipleLocksNoTransitivity) { | 168 TEST(TaskSchedulerLock, AcquireMultipleLocksNoTransitivity) { |
169 SchedulerLock lock1; | 169 SchedulerLock lock1; |
170 SchedulerLock lock2(&lock1); | 170 SchedulerLock lock2(&lock1); |
171 SchedulerLock lock3(&lock2); | 171 SchedulerLock lock3(&lock2); |
172 EXPECT_DCHECK_DEATH({ | 172 EXPECT_DCHECK_DEATH({ |
173 lock1.Acquire(); | 173 lock1.Acquire(); |
174 lock3.Acquire(); | 174 lock3.Acquire(); |
175 }, ""); | 175 }); |
176 } | 176 } |
177 | 177 |
178 TEST(TaskSchedulerLock, AcquireLocksDifferentThreadsSafely) { | 178 TEST(TaskSchedulerLock, AcquireLocksDifferentThreadsSafely) { |
179 SchedulerLock lock1; | 179 SchedulerLock lock1; |
180 SchedulerLock lock2; | 180 SchedulerLock lock2; |
181 BasicLockAcquireAndWaitThread thread(&lock1); | 181 BasicLockAcquireAndWaitThread thread(&lock1); |
182 thread.Start(); | 182 thread.Start(); |
183 | 183 |
184 lock2.Acquire(); | 184 lock2.Acquire(); |
185 thread.WaitForLockAcquisition(); | 185 thread.WaitForLockAcquisition(); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 predecessor.Release(); | 251 predecessor.Release(); |
252 } | 252 } |
253 | 253 |
254 TEST(TaskSchedulerLock, SelfReferentialLock) { | 254 TEST(TaskSchedulerLock, SelfReferentialLock) { |
255 struct SelfReferentialLock { | 255 struct SelfReferentialLock { |
256 SelfReferentialLock() : lock(&lock) {} | 256 SelfReferentialLock() : lock(&lock) {} |
257 | 257 |
258 SchedulerLock lock; | 258 SchedulerLock lock; |
259 }; | 259 }; |
260 | 260 |
261 EXPECT_DCHECK_DEATH({ SelfReferentialLock lock; }, ""); | 261 EXPECT_DCHECK_DEATH({ SelfReferentialLock lock; }); |
262 } | 262 } |
263 | 263 |
264 TEST(TaskSchedulerLock, PredecessorCycle) { | 264 TEST(TaskSchedulerLock, PredecessorCycle) { |
265 struct LockCycle { | 265 struct LockCycle { |
266 LockCycle() : lock1(&lock2), lock2(&lock1) {} | 266 LockCycle() : lock1(&lock2), lock2(&lock1) {} |
267 | 267 |
268 SchedulerLock lock1; | 268 SchedulerLock lock1; |
269 SchedulerLock lock2; | 269 SchedulerLock lock2; |
270 }; | 270 }; |
271 | 271 |
272 EXPECT_DCHECK_DEATH({ LockCycle cycle; }, ""); | 272 EXPECT_DCHECK_DEATH({ LockCycle cycle; }); |
273 } | 273 } |
274 | 274 |
275 TEST(TaskSchedulerLock, PredecessorLongerCycle) { | 275 TEST(TaskSchedulerLock, PredecessorLongerCycle) { |
276 struct LockCycle { | 276 struct LockCycle { |
277 LockCycle() | 277 LockCycle() |
278 : lock1(&lock5), | 278 : lock1(&lock5), |
279 lock2(&lock1), | 279 lock2(&lock1), |
280 lock3(&lock2), | 280 lock3(&lock2), |
281 lock4(&lock3), | 281 lock4(&lock3), |
282 lock5(&lock4) {} | 282 lock5(&lock4) {} |
283 | 283 |
284 SchedulerLock lock1; | 284 SchedulerLock lock1; |
285 SchedulerLock lock2; | 285 SchedulerLock lock2; |
286 SchedulerLock lock3; | 286 SchedulerLock lock3; |
287 SchedulerLock lock4; | 287 SchedulerLock lock4; |
288 SchedulerLock lock5; | 288 SchedulerLock lock5; |
289 }; | 289 }; |
290 | 290 |
291 EXPECT_DCHECK_DEATH({ LockCycle cycle; }, ""); | 291 EXPECT_DCHECK_DEATH({ LockCycle cycle; }); |
292 } | 292 } |
293 | 293 |
294 } // namespace | 294 } // namespace |
295 } // namespace internal | 295 } // namespace internal |
296 } // namespace base | 296 } // namespace base |
OLD | NEW |