| 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 "components/scheduler/base/task_queue_manager.h" | 5 #include "components/scheduler/base/task_queue_manager.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
| 10 #include "base/test/simple_test_tick_clock.h" | 10 #include "base/test/simple_test_tick_clock.h" |
| (...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 delay1); | 1088 delay1); |
| 1089 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 1089 runners_[1]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 1090 delay2); | 1090 delay2); |
| 1091 | 1091 |
| 1092 now_src_->Advance(delay1 * 2); | 1092 now_src_->Advance(delay1 * 2); |
| 1093 test_task_runner_->RunUntilIdle(); | 1093 test_task_runner_->RunUntilIdle(); |
| 1094 | 1094 |
| 1095 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 1095 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 TEST_F(TaskQueueManagerTest, DelayedTaskWithAbsoluteRunTime) { | |
| 1099 Initialize(1u); | |
| 1100 | |
| 1101 // One task in the past, two with the exact same run time and one in the | |
| 1102 // future. | |
| 1103 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); | |
| 1104 base::TimeTicks runTime1 = now_src_->NowTicks() - delay; | |
| 1105 base::TimeTicks runTime2 = now_src_->NowTicks(); | |
| 1106 base::TimeTicks runTime3 = now_src_->NowTicks(); | |
| 1107 base::TimeTicks runTime4 = now_src_->NowTicks() + delay; | |
| 1108 | |
| 1109 std::vector<int> run_order; | |
| 1110 runners_[0]->PostDelayedTaskAt( | |
| 1111 FROM_HERE, base::Bind(&TestTask, 1, &run_order), runTime1); | |
| 1112 runners_[0]->PostDelayedTaskAt( | |
| 1113 FROM_HERE, base::Bind(&TestTask, 2, &run_order), runTime2); | |
| 1114 runners_[0]->PostDelayedTaskAt( | |
| 1115 FROM_HERE, base::Bind(&TestTask, 3, &run_order), runTime3); | |
| 1116 runners_[0]->PostDelayedTaskAt( | |
| 1117 FROM_HERE, base::Bind(&TestTask, 4, &run_order), runTime4); | |
| 1118 | |
| 1119 now_src_->Advance(2 * delay); | |
| 1120 test_task_runner_->RunUntilIdle(); | |
| 1121 | |
| 1122 EXPECT_THAT(run_order, ElementsAre(1, 2, 3, 4)); | |
| 1123 } | |
| 1124 | |
| 1125 void CheckIsNested(bool* is_nested) { | 1098 void CheckIsNested(bool* is_nested) { |
| 1126 *is_nested = base::MessageLoop::current()->IsNested(); | 1099 *is_nested = base::MessageLoop::current()->IsNested(); |
| 1127 } | 1100 } |
| 1128 | 1101 |
| 1129 void PostAndQuitFromNestedRunloop(base::RunLoop* run_loop, | 1102 void PostAndQuitFromNestedRunloop(base::RunLoop* run_loop, |
| 1130 base::SingleThreadTaskRunner* runner, | 1103 base::SingleThreadTaskRunner* runner, |
| 1131 bool* was_nested) { | 1104 bool* was_nested) { |
| 1132 base::MessageLoop::ScopedNestableTaskAllower allow( | 1105 base::MessageLoop::ScopedNestableTaskAllower allow( |
| 1133 base::MessageLoop::current()); | 1106 base::MessageLoop::current()); |
| 1134 runner->PostTask(FROM_HERE, run_loop->QuitClosure()); | 1107 runner->PostTask(FROM_HERE, run_loop->QuitClosure()); |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1309 | 1282 |
| 1310 scoped_refptr<internal::TaskQueueImpl> task_queue = | 1283 scoped_refptr<internal::TaskQueueImpl> task_queue = |
| 1311 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); | 1284 manager_->NewTaskQueue(TaskQueue::Spec("test_queue")); |
| 1312 | 1285 |
| 1313 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); | 1286 EXPECT_CALL(observer, OnUnregisterTaskQueue(_)).Times(1); |
| 1314 task_queue->UnregisterTaskQueue(); | 1287 task_queue->UnregisterTaskQueue(); |
| 1315 | 1288 |
| 1316 manager_->SetObserver(nullptr); | 1289 manager_->SetObserver(nullptr); |
| 1317 } | 1290 } |
| 1318 | 1291 |
| 1319 TEST_F(TaskQueueManagerTest, ScheduleDelayedWorkIsNotReEntrant) { | |
| 1320 Initialize(1u); | |
| 1321 | |
| 1322 // Post two tasks into the past. The second one used to trigger a deadlock | |
| 1323 // because it tried to re-entrantly wake the first task in the same queue. | |
| 1324 runners_[0]->PostDelayedTaskAt( | |
| 1325 FROM_HERE, base::Bind(&NullTask), | |
| 1326 base::TimeTicks() + base::TimeDelta::FromMicroseconds(100)); | |
| 1327 runners_[0]->PostDelayedTaskAt( | |
| 1328 FROM_HERE, base::Bind(&NullTask), | |
| 1329 base::TimeTicks() + base::TimeDelta::FromMicroseconds(200)); | |
| 1330 test_task_runner_->RunUntilIdle(); | |
| 1331 } | |
| 1332 | |
| 1333 void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { | 1292 void HasOneRefTask(std::vector<bool>* log, internal::TaskQueueImpl* tq) { |
| 1334 log->push_back(tq->HasOneRef()); | 1293 log->push_back(tq->HasOneRef()); |
| 1335 } | 1294 } |
| 1336 | 1295 |
| 1337 TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { | 1296 TEST_F(TaskQueueManagerTest, UnregisterTaskQueueInNestedLoop) { |
| 1338 InitializeWithRealMessageLoop(1u); | 1297 InitializeWithRealMessageLoop(1u); |
| 1339 | 1298 |
| 1340 // We retain a reference to the task queue even when the manager has deleted | 1299 // We retain a reference to the task queue even when the manager has deleted |
| 1341 // its reference. | 1300 // its reference. |
| 1342 scoped_refptr<internal::TaskQueueImpl> task_queue = | 1301 scoped_refptr<internal::TaskQueueImpl> task_queue = |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1370 // release its reference, and checks that it has. | 1329 // release its reference, and checks that it has. |
| 1371 runners_[0]->PostTask(FROM_HERE, | 1330 runners_[0]->PostTask(FROM_HERE, |
| 1372 base::Bind(&HasOneRefTask, base::Unretained(&log), | 1331 base::Bind(&HasOneRefTask, base::Unretained(&log), |
| 1373 base::Unretained(task_queue.get()))); | 1332 base::Unretained(task_queue.get()))); |
| 1374 message_loop_->RunUntilIdle(); | 1333 message_loop_->RunUntilIdle(); |
| 1375 | 1334 |
| 1376 EXPECT_THAT(log, ElementsAre(false, false, true)); | 1335 EXPECT_THAT(log, ElementsAre(false, false, true)); |
| 1377 } | 1336 } |
| 1378 | 1337 |
| 1379 } // namespace scheduler | 1338 } // namespace scheduler |
| OLD | NEW |