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 "platform/scheduler/base/task_queue_manager.h" | 5 #include "platform/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
265 runners_.push_back( | 265 runners_.push_back( |
266 manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); | 266 manager_->NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::TEST))); |
267 | 267 |
268 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 268 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
269 for (int i = 0; i <= 6; ++i) { | 269 for (int i = 0; i <= 6; ++i) { |
270 tasks_to_post_from_nested_loop.push_back( | 270 tasks_to_post_from_nested_loop.push_back( |
271 std::make_pair(base::Bind(&NopTask), true)); | 271 std::make_pair(base::Bind(&NopTask), true)); |
272 } | 272 } |
273 | 273 |
274 runners_[0]->PostTask( | 274 runners_[0]->PostTask( |
275 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), | 275 FROM_HERE, |
276 base::RetainedRef(runners_[0]), | 276 base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
277 base::Unretained(&tasks_to_post_from_nested_loop))); | 277 base::RetainedRef(runners_[0]), |
| 278 base::Unretained(&tasks_to_post_from_nested_loop))); |
278 | 279 |
279 base::RunLoop().RunUntilIdle(); | 280 base::RunLoop().RunUntilIdle(); |
280 // We need to call Now twice, to measure the start and end of the outermost | 281 // We need to call Now twice, to measure the start and end of the outermost |
281 // task. We shouldn't call it for any of the nested tasks. | 282 // task. We shouldn't call it for any of the nested tasks. |
282 EXPECT_EQ(2, test_count_uses_time_source->now_calls_count()); | 283 EXPECT_EQ(2, test_count_uses_time_source->now_calls_count()); |
283 } | 284 } |
284 | 285 |
285 void NullTask() {} | 286 void NullTask() {} |
286 | 287 |
287 void TestTask(EnqueueOrder value, std::vector<EnqueueOrder>* out_result) { | 288 void TestTask(EnqueueOrder value, std::vector<EnqueueOrder>* out_result) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 | 351 |
351 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 352 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
352 tasks_to_post_from_nested_loop.push_back( | 353 tasks_to_post_from_nested_loop.push_back( |
353 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); | 354 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); |
354 tasks_to_post_from_nested_loop.push_back( | 355 tasks_to_post_from_nested_loop.push_back( |
355 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); | 356 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); |
356 tasks_to_post_from_nested_loop.push_back( | 357 tasks_to_post_from_nested_loop.push_back( |
357 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); | 358 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); |
358 | 359 |
359 runners_[0]->PostTask( | 360 runners_[0]->PostTask( |
360 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), | 361 FROM_HERE, |
361 base::RetainedRef(runners_[0]), | 362 base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
362 base::Unretained(&tasks_to_post_from_nested_loop))); | 363 base::RetainedRef(runners_[0]), |
| 364 base::Unretained(&tasks_to_post_from_nested_loop))); |
363 | 365 |
364 base::RunLoop().RunUntilIdle(); | 366 base::RunLoop().RunUntilIdle(); |
365 // Note we expect task 3 to run last because it's non-nestable. | 367 // Note we expect task 3 to run last because it's non-nestable. |
366 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); | 368 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
367 } | 369 } |
368 | 370 |
369 TEST_F(TaskQueueManagerTest, HasPendingImmediateWork_ImmediateTask) { | 371 TEST_F(TaskQueueManagerTest, HasPendingImmediateWork_ImmediateTask) { |
370 Initialize(1u); | 372 Initialize(1u); |
371 | 373 |
372 std::vector<EnqueueOrder> run_order; | 374 std::vector<EnqueueOrder> run_order; |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 FROM_HERE, base::Bind(&PostTaskToRunner, runners_[0], &run_order)); | 856 FROM_HERE, base::Bind(&PostTaskToRunner, runners_[0], &run_order)); |
855 thread.Stop(); | 857 thread.Stop(); |
856 | 858 |
857 base::RunLoop().RunUntilIdle(); | 859 base::RunLoop().RunUntilIdle(); |
858 EXPECT_THAT(run_order, ElementsAre(1)); | 860 EXPECT_THAT(run_order, ElementsAre(1)); |
859 } | 861 } |
860 | 862 |
861 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 863 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
862 int* run_count) { | 864 int* run_count) { |
863 (*run_count)++; | 865 (*run_count)++; |
864 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask, | 866 runner->PostTask( |
865 base::Unretained(runner.get()), run_count)); | 867 FROM_HERE, |
| 868 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); |
866 } | 869 } |
867 | 870 |
868 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { | 871 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { |
869 Initialize(1u); | 872 Initialize(1u); |
870 | 873 |
871 int run_count = 0; | 874 int run_count = 0; |
872 runners_[0]->PostTask( | 875 runners_[0]->PostTask( |
873 FROM_HERE, base::Bind(&RePostingTestTask, runners_[0], &run_count)); | 876 FROM_HERE, base::Bind(&RePostingTestTask, runners_[0], &run_count)); |
874 | 877 |
875 test_task_runner_->RunPendingTasks(); | 878 test_task_runner_->RunPendingTasks(); |
876 // NOTE without the executing_task_ check in MaybeScheduleDoWork there | 879 // NOTE without the executing_task_ check in MaybeScheduleDoWork there |
877 // will be two tasks here. | 880 // will be two tasks here. |
878 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks()); | 881 EXPECT_EQ(1u, test_task_runner_->NumPendingTasks()); |
879 EXPECT_EQ(1, run_count); | 882 EXPECT_EQ(1, run_count); |
880 } | 883 } |
881 | 884 |
882 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { | 885 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { |
883 InitializeWithRealMessageLoop(1u); | 886 InitializeWithRealMessageLoop(1u); |
884 | 887 |
885 std::vector<EnqueueOrder> run_order; | 888 std::vector<EnqueueOrder> run_order; |
886 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 889 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
887 tasks_to_post_from_nested_loop.push_back( | 890 tasks_to_post_from_nested_loop.push_back( |
888 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); | 891 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); |
889 | 892 |
890 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); | 893 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); |
891 runners_[0]->PostTask( | 894 runners_[0]->PostTask( |
892 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), | 895 FROM_HERE, |
893 base::RetainedRef(runners_[0]), | 896 base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
894 base::Unretained(&tasks_to_post_from_nested_loop))); | 897 base::RetainedRef(runners_[0]), |
| 898 base::Unretained(&tasks_to_post_from_nested_loop))); |
895 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 899 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
896 | 900 |
897 base::RunLoop().RunUntilIdle(); | 901 base::RunLoop().RunUntilIdle(); |
898 | 902 |
899 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); | 903 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); |
900 } | 904 } |
901 | 905 |
902 TEST_F(TaskQueueManagerTest, WorkBatching) { | 906 TEST_F(TaskQueueManagerTest, WorkBatching) { |
903 Initialize(1u); | 907 Initialize(1u); |
904 | 908 |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1091 | 1095 |
1092 base::TimeTicks run_time; | 1096 base::TimeTicks run_time; |
1093 EXPECT_TRUE(manager_->real_time_domain()->NextScheduledRunTime(&run_time)); | 1097 EXPECT_TRUE(manager_->real_time_domain()->NextScheduledRunTime(&run_time)); |
1094 EXPECT_EQ(now_src_->NowTicks() + delay2, run_time); | 1098 EXPECT_EQ(now_src_->NowTicks() + delay2, run_time); |
1095 } | 1099 } |
1096 | 1100 |
1097 TEST_F(TaskQueueManagerTest, DeleteTaskQueueManagerInsideATask) { | 1101 TEST_F(TaskQueueManagerTest, DeleteTaskQueueManagerInsideATask) { |
1098 Initialize(1u); | 1102 Initialize(1u); |
1099 | 1103 |
1100 runners_[0]->PostTask( | 1104 runners_[0]->PostTask( |
1101 FROM_HERE, base::Bind(&TaskQueueManagerTest::DeleteTaskQueueManager, | 1105 FROM_HERE, |
1102 base::Unretained(this))); | 1106 base::Bind(&TaskQueueManagerTest::DeleteTaskQueueManager, |
| 1107 base::Unretained(this))); |
1103 | 1108 |
1104 // This should not crash, assuming DoWork detects the TaskQueueManager has | 1109 // This should not crash, assuming DoWork detects the TaskQueueManager has |
1105 // been deleted. | 1110 // been deleted. |
1106 test_task_runner_->RunUntilIdle(); | 1111 test_task_runner_->RunUntilIdle(); |
1107 } | 1112 } |
1108 | 1113 |
1109 TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) { | 1114 TEST_F(TaskQueueManagerTest, GetAndClearSystemIsQuiescentBit) { |
1110 Initialize(3u); | 1115 Initialize(3u); |
1111 | 1116 |
1112 scoped_refptr<internal::TaskQueueImpl> queue0 = | 1117 scoped_refptr<internal::TaskQueueImpl> queue0 = |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); | 1194 base::TimeDelta delay = base::TimeDelta::FromMilliseconds(10); |
1190 for (int i = 10; i < 19; i++) { | 1195 for (int i = 10; i < 19; i++) { |
1191 runners_[0]->PostDelayedTask( | 1196 runners_[0]->PostDelayedTask( |
1192 FROM_HERE, | 1197 FROM_HERE, |
1193 base::Bind(&ExpensiveTestTask, i, now_src_.get(), &run_order), delay); | 1198 base::Bind(&ExpensiveTestTask, i, now_src_.get(), &run_order), delay); |
1194 } | 1199 } |
1195 | 1200 |
1196 test_task_runner_->RunForPeriod(delay); | 1201 test_task_runner_->RunForPeriod(delay); |
1197 | 1202 |
1198 for (int i = 0; i < 9; i++) { | 1203 for (int i = 0; i < 9; i++) { |
1199 runners_[0]->PostTask(FROM_HERE, base::Bind(&ExpensiveTestTask, i, | 1204 runners_[0]->PostTask( |
1200 now_src_.get(), &run_order)); | 1205 FROM_HERE, |
| 1206 base::Bind(&ExpensiveTestTask, i, now_src_.get(), &run_order)); |
1201 } | 1207 } |
1202 | 1208 |
1203 test_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1209 test_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
1204 test_task_runner_->RunUntilIdle(); | 1210 test_task_runner_->RunUntilIdle(); |
1205 | 1211 |
1206 // Delayed tasks are not allowed to starve out immediate work which is why | 1212 // Delayed tasks are not allowed to starve out immediate work which is why |
1207 // some of the immediate tasks run out of order. | 1213 // some of the immediate tasks run out of order. |
1208 int expected_run_order[] = {10, 11, 12, 13, 0, 14, 15, 16, 1, | 1214 int expected_run_order[] = {10, 11, 12, 13, 0, 14, 15, 16, 1, |
1209 17, 18, 2, 3, 4, 5, 6, 7, 8}; | 1215 17, 18, 2, 3, 4, 5, 6, 7, 8}; |
1210 EXPECT_THAT(run_order, ElementsAreArray(expected_run_order)); | 1216 EXPECT_THAT(run_order, ElementsAreArray(expected_run_order)); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 } | 1282 } |
1277 | 1283 |
1278 TEST_F(TaskQueueManagerTest, QuitWhileNested) { | 1284 TEST_F(TaskQueueManagerTest, QuitWhileNested) { |
1279 // This test makes sure we don't continue running a work batch after a nested | 1285 // This test makes sure we don't continue running a work batch after a nested |
1280 // run loop has been exited in the middle of the batch. | 1286 // run loop has been exited in the middle of the batch. |
1281 InitializeWithRealMessageLoop(1u); | 1287 InitializeWithRealMessageLoop(1u); |
1282 manager_->SetWorkBatchSize(2); | 1288 manager_->SetWorkBatchSize(2); |
1283 | 1289 |
1284 bool was_nested = true; | 1290 bool was_nested = true; |
1285 base::RunLoop run_loop; | 1291 base::RunLoop run_loop; |
1286 runners_[0]->PostTask(FROM_HERE, base::Bind(&PostAndQuitFromNestedRunloop, | 1292 runners_[0]->PostTask( |
1287 base::Unretained(&run_loop), | 1293 FROM_HERE, |
1288 base::RetainedRef(runners_[0]), | 1294 base::Bind(&PostAndQuitFromNestedRunloop, base::Unretained(&run_loop), |
1289 base::Unretained(&was_nested))); | 1295 base::RetainedRef(runners_[0]), |
| 1296 base::Unretained(&was_nested))); |
1290 | 1297 |
1291 base::RunLoop().RunUntilIdle(); | 1298 base::RunLoop().RunUntilIdle(); |
1292 EXPECT_FALSE(was_nested); | 1299 EXPECT_FALSE(was_nested); |
1293 } | 1300 } |
1294 | 1301 |
1295 class SequenceNumberCapturingTaskObserver | 1302 class SequenceNumberCapturingTaskObserver |
1296 : public base::MessageLoop::TaskObserver { | 1303 : public base::MessageLoop::TaskObserver { |
1297 public: | 1304 public: |
1298 // MessageLoop::TaskObserver overrides. | 1305 // MessageLoop::TaskObserver overrides. |
1299 void WillProcessTask(const base::PendingTask& pending_task) override {} | 1306 void WillProcessTask(const base::PendingTask& pending_task) override {} |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1518 true)); | 1525 true)); |
1519 tasks_to_post_from_nested_loop.push_back( | 1526 tasks_to_post_from_nested_loop.push_back( |
1520 std::make_pair(base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue, | 1527 std::make_pair(base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue, |
1521 base::Unretained(task_queue.get())), | 1528 base::Unretained(task_queue.get())), |
1522 true)); | 1529 true)); |
1523 tasks_to_post_from_nested_loop.push_back( | 1530 tasks_to_post_from_nested_loop.push_back( |
1524 std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), | 1531 std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), |
1525 base::Unretained(task_queue.get())), | 1532 base::Unretained(task_queue.get())), |
1526 true)); | 1533 true)); |
1527 runners_[0]->PostTask( | 1534 runners_[0]->PostTask( |
1528 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), | 1535 FROM_HERE, |
1529 base::RetainedRef(runners_[0]), | 1536 base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
1530 base::Unretained(&tasks_to_post_from_nested_loop))); | 1537 base::RetainedRef(runners_[0]), |
| 1538 base::Unretained(&tasks_to_post_from_nested_loop))); |
1531 base::RunLoop().RunUntilIdle(); | 1539 base::RunLoop().RunUntilIdle(); |
1532 | 1540 |
1533 // Add a final call to HasOneRefTask. This gives the manager a chance to | 1541 // Add a final call to HasOneRefTask. This gives the manager a chance to |
1534 // release its reference, and checks that it has. | 1542 // release its reference, and checks that it has. |
1535 runners_[0]->PostTask(FROM_HERE, | 1543 runners_[0]->PostTask(FROM_HERE, |
1536 base::Bind(&HasOneRefTask, base::Unretained(&log), | 1544 base::Bind(&HasOneRefTask, base::Unretained(&log), |
1537 base::Unretained(task_queue.get()))); | 1545 base::Unretained(task_queue.get()))); |
1538 base::RunLoop().RunUntilIdle(); | 1546 base::RunLoop().RunUntilIdle(); |
1539 | 1547 |
1540 EXPECT_THAT(log, ElementsAre(false, false, true)); | 1548 EXPECT_THAT(log, ElementsAre(false, false, true)); |
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2040 } | 2048 } |
2041 } | 2049 } |
2042 | 2050 |
2043 TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) { | 2051 TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_TaskRunning) { |
2044 Initialize(2u); | 2052 Initialize(2u); |
2045 | 2053 |
2046 internal::TaskQueueImpl* queue0 = runners_[0].get(); | 2054 internal::TaskQueueImpl* queue0 = runners_[0].get(); |
2047 internal::TaskQueueImpl* queue1 = runners_[1].get(); | 2055 internal::TaskQueueImpl* queue1 = runners_[1].get(); |
2048 | 2056 |
2049 std::vector<TaskQueue*> task_sources; | 2057 std::vector<TaskQueue*> task_sources; |
2050 queue0->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, | 2058 queue0->PostTask(FROM_HERE, |
2051 manager_.get(), &task_sources)); | 2059 base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
2052 queue1->PostTask(FROM_HERE, base::Bind(&CurrentlyExecutingTaskQueueTestTask, | 2060 manager_.get(), &task_sources)); |
2053 manager_.get(), &task_sources)); | 2061 queue1->PostTask(FROM_HERE, |
| 2062 base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
| 2063 manager_.get(), &task_sources)); |
2054 test_task_runner_->RunUntilIdle(); | 2064 test_task_runner_->RunUntilIdle(); |
2055 | 2065 |
2056 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1)); | 2066 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1)); |
2057 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); | 2067 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
2058 } | 2068 } |
2059 | 2069 |
2060 namespace { | 2070 namespace { |
2061 void RunloopCurrentlyExecutingTaskQueueTestTask( | 2071 void RunloopCurrentlyExecutingTaskQueueTestTask( |
2062 base::MessageLoop* message_loop, | 2072 base::MessageLoop* message_loop, |
2063 TaskQueueManager* task_queue_manager, | 2073 TaskQueueManager* task_queue_manager, |
(...skipping 23 matching lines...) Expand all Loading... |
2087 tasks_to_post_from_nested_loop; | 2097 tasks_to_post_from_nested_loop; |
2088 tasks_to_post_from_nested_loop.push_back( | 2098 tasks_to_post_from_nested_loop.push_back( |
2089 std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, | 2099 std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
2090 manager_.get(), &task_sources), | 2100 manager_.get(), &task_sources), |
2091 queue1)); | 2101 queue1)); |
2092 tasks_to_post_from_nested_loop.push_back( | 2102 tasks_to_post_from_nested_loop.push_back( |
2093 std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, | 2103 std::make_pair(base::Bind(&CurrentlyExecutingTaskQueueTestTask, |
2094 manager_.get(), &task_sources), | 2104 manager_.get(), &task_sources), |
2095 queue2)); | 2105 queue2)); |
2096 | 2106 |
2097 queue0->PostTask( | 2107 queue0->PostTask(FROM_HERE, |
2098 FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, | 2108 base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, |
2099 message_loop_.get(), manager_.get(), &task_sources, | 2109 message_loop_.get(), manager_.get(), |
2100 &tasks_to_post_from_nested_loop)); | 2110 &task_sources, &tasks_to_post_from_nested_loop)); |
2101 | 2111 |
2102 base::RunLoop().RunUntilIdle(); | 2112 base::RunLoop().RunUntilIdle(); |
2103 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); | 2113 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); |
2104 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); | 2114 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
2105 } | 2115 } |
2106 | 2116 |
2107 void OnTraceDataCollected(base::Closure quit_closure, | 2117 void OnTraceDataCollected(base::Closure quit_closure, |
2108 base::trace_event::TraceResultBuffer* buffer, | 2118 base::trace_event::TraceResultBuffer* buffer, |
2109 const scoped_refptr<base::RefCountedString>& json, | 2119 const scoped_refptr<base::RefCountedString>& json, |
2110 bool has_more_events) { | 2120 bool has_more_events) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2195 CancelableTask task1(now_src_.get()); | 2205 CancelableTask task1(now_src_.get()); |
2196 CancelableTask task2(now_src_.get()); | 2206 CancelableTask task2(now_src_.get()); |
2197 CancelableTask task3(now_src_.get()); | 2207 CancelableTask task3(now_src_.get()); |
2198 CancelableTask task4(now_src_.get()); | 2208 CancelableTask task4(now_src_.get()); |
2199 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); | 2209 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); |
2200 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); | 2210 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); |
2201 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); | 2211 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); |
2202 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); | 2212 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); |
2203 std::vector<base::TimeTicks> run_times; | 2213 std::vector<base::TimeTicks> run_times; |
2204 runners_[0]->PostDelayedTask( | 2214 runners_[0]->PostDelayedTask( |
2205 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2215 FROM_HERE, |
2206 task1.weak_factory_.GetWeakPtr(), &run_times), | 2216 base::Bind(&CancelableTask::RecordTimeTask, |
| 2217 task1.weak_factory_.GetWeakPtr(), &run_times), |
2207 delay1); | 2218 delay1); |
2208 runners_[0]->PostDelayedTask( | 2219 runners_[0]->PostDelayedTask( |
2209 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2220 FROM_HERE, |
2210 task2.weak_factory_.GetWeakPtr(), &run_times), | 2221 base::Bind(&CancelableTask::RecordTimeTask, |
| 2222 task2.weak_factory_.GetWeakPtr(), &run_times), |
2211 delay2); | 2223 delay2); |
2212 runners_[0]->PostDelayedTask( | 2224 runners_[0]->PostDelayedTask( |
2213 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2225 FROM_HERE, |
2214 task3.weak_factory_.GetWeakPtr(), &run_times), | 2226 base::Bind(&CancelableTask::RecordTimeTask, |
| 2227 task3.weak_factory_.GetWeakPtr(), &run_times), |
2215 delay3); | 2228 delay3); |
2216 runners_[0]->PostDelayedTask( | 2229 runners_[0]->PostDelayedTask( |
2217 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2230 FROM_HERE, |
2218 task4.weak_factory_.GetWeakPtr(), &run_times), | 2231 base::Bind(&CancelableTask::RecordTimeTask, |
| 2232 task4.weak_factory_.GetWeakPtr(), &run_times), |
2219 delay4); | 2233 delay4); |
2220 | 2234 |
2221 task2.weak_factory_.InvalidateWeakPtrs(); | 2235 task2.weak_factory_.InvalidateWeakPtrs(); |
2222 task3.weak_factory_.InvalidateWeakPtrs(); | 2236 task3.weak_factory_.InvalidateWeakPtrs(); |
2223 | 2237 |
2224 std::set<base::TimeTicks> wakeup_times; | 2238 std::set<base::TimeTicks> wakeup_times; |
2225 | 2239 |
2226 RunUntilIdle(base::Bind( | 2240 RunUntilIdle(base::Bind( |
2227 [](std::set<base::TimeTicks>* wakeup_times, | 2241 [](std::set<base::TimeTicks>* wakeup_times, |
2228 base::SimpleTestTickClock* clock) { | 2242 base::SimpleTestTickClock* clock) { |
(...skipping 14 matching lines...) Expand all Loading... |
2243 CancelableTask task1(now_src_.get()); | 2257 CancelableTask task1(now_src_.get()); |
2244 CancelableTask task2(now_src_.get()); | 2258 CancelableTask task2(now_src_.get()); |
2245 CancelableTask task3(now_src_.get()); | 2259 CancelableTask task3(now_src_.get()); |
2246 CancelableTask task4(now_src_.get()); | 2260 CancelableTask task4(now_src_.get()); |
2247 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); | 2261 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); |
2248 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); | 2262 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); |
2249 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); | 2263 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); |
2250 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); | 2264 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); |
2251 std::vector<base::TimeTicks> run_times; | 2265 std::vector<base::TimeTicks> run_times; |
2252 runners_[0]->PostDelayedTask( | 2266 runners_[0]->PostDelayedTask( |
2253 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2267 FROM_HERE, |
2254 task4.weak_factory_.GetWeakPtr(), &run_times), | 2268 base::Bind(&CancelableTask::RecordTimeTask, |
| 2269 task4.weak_factory_.GetWeakPtr(), &run_times), |
2255 delay4); | 2270 delay4); |
2256 runners_[0]->PostDelayedTask( | 2271 runners_[0]->PostDelayedTask( |
2257 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2272 FROM_HERE, |
2258 task3.weak_factory_.GetWeakPtr(), &run_times), | 2273 base::Bind(&CancelableTask::RecordTimeTask, |
| 2274 task3.weak_factory_.GetWeakPtr(), &run_times), |
2259 delay3); | 2275 delay3); |
2260 runners_[0]->PostDelayedTask( | 2276 runners_[0]->PostDelayedTask( |
2261 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2277 FROM_HERE, |
2262 task2.weak_factory_.GetWeakPtr(), &run_times), | 2278 base::Bind(&CancelableTask::RecordTimeTask, |
| 2279 task2.weak_factory_.GetWeakPtr(), &run_times), |
2263 delay2); | 2280 delay2); |
2264 runners_[0]->PostDelayedTask( | 2281 runners_[0]->PostDelayedTask( |
2265 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2282 FROM_HERE, |
2266 task1.weak_factory_.GetWeakPtr(), &run_times), | 2283 base::Bind(&CancelableTask::RecordTimeTask, |
| 2284 task1.weak_factory_.GetWeakPtr(), &run_times), |
2267 delay1); | 2285 delay1); |
2268 | 2286 |
2269 task2.weak_factory_.InvalidateWeakPtrs(); | 2287 task2.weak_factory_.InvalidateWeakPtrs(); |
2270 task3.weak_factory_.InvalidateWeakPtrs(); | 2288 task3.weak_factory_.InvalidateWeakPtrs(); |
2271 | 2289 |
2272 std::set<base::TimeTicks> wakeup_times; | 2290 std::set<base::TimeTicks> wakeup_times; |
2273 | 2291 |
2274 RunUntilIdle(base::Bind( | 2292 RunUntilIdle(base::Bind( |
2275 [](std::set<base::TimeTicks>* wakeup_times, | 2293 [](std::set<base::TimeTicks>* wakeup_times, |
2276 base::SimpleTestTickClock* clock) { | 2294 base::SimpleTestTickClock* clock) { |
(...skipping 14 matching lines...) Expand all Loading... |
2291 CancelableTask task1(now_src_.get()); | 2309 CancelableTask task1(now_src_.get()); |
2292 CancelableTask task2(now_src_.get()); | 2310 CancelableTask task2(now_src_.get()); |
2293 CancelableTask task3(now_src_.get()); | 2311 CancelableTask task3(now_src_.get()); |
2294 CancelableTask task4(now_src_.get()); | 2312 CancelableTask task4(now_src_.get()); |
2295 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); | 2313 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); |
2296 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); | 2314 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); |
2297 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); | 2315 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); |
2298 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); | 2316 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); |
2299 std::vector<base::TimeTicks> run_times; | 2317 std::vector<base::TimeTicks> run_times; |
2300 runners_[0]->PostDelayedTask( | 2318 runners_[0]->PostDelayedTask( |
2301 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2319 FROM_HERE, |
2302 task1.weak_factory_.GetWeakPtr(), &run_times), | 2320 base::Bind(&CancelableTask::RecordTimeTask, |
| 2321 task1.weak_factory_.GetWeakPtr(), &run_times), |
2303 delay1); | 2322 delay1); |
2304 runners_[0]->PostDelayedTask( | 2323 runners_[0]->PostDelayedTask( |
2305 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2324 FROM_HERE, |
2306 task2.weak_factory_.GetWeakPtr(), &run_times), | 2325 base::Bind(&CancelableTask::RecordTimeTask, |
| 2326 task2.weak_factory_.GetWeakPtr(), &run_times), |
2307 delay2); | 2327 delay2); |
2308 runners_[0]->PostDelayedTask( | 2328 runners_[0]->PostDelayedTask( |
2309 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2329 FROM_HERE, |
2310 task3.weak_factory_.GetWeakPtr(), &run_times), | 2330 base::Bind(&CancelableTask::RecordTimeTask, |
| 2331 task3.weak_factory_.GetWeakPtr(), &run_times), |
2311 delay3); | 2332 delay3); |
2312 runners_[0]->PostDelayedTask( | 2333 runners_[0]->PostDelayedTask( |
2313 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2334 FROM_HERE, |
2314 task4.weak_factory_.GetWeakPtr(), &run_times), | 2335 base::Bind(&CancelableTask::RecordTimeTask, |
| 2336 task4.weak_factory_.GetWeakPtr(), &run_times), |
2315 delay4); | 2337 delay4); |
2316 | 2338 |
2317 // Post a non-canceled task with |delay3|. So we should still get a wakeup at | 2339 // Post a non-canceled task with |delay3|. So we should still get a wakeup at |
2318 // |delay3| even though we cancel |task3|. | 2340 // |delay3| even though we cancel |task3|. |
2319 runners_[0]->PostDelayedTask(FROM_HERE, | 2341 runners_[0]->PostDelayedTask(FROM_HERE, |
2320 base::Bind(&CancelableTask::RecordTimeTask, | 2342 base::Bind(&CancelableTask::RecordTimeTask, |
2321 base::Unretained(&task3), &run_times), | 2343 base::Unretained(&task3), &run_times), |
2322 delay3); | 2344 delay3); |
2323 | 2345 |
2324 task2.weak_factory_.InvalidateWeakPtrs(); | 2346 task2.weak_factory_.InvalidateWeakPtrs(); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2425 CancelableTask task1(now_src_.get()); | 2447 CancelableTask task1(now_src_.get()); |
2426 CancelableTask task2(now_src_.get()); | 2448 CancelableTask task2(now_src_.get()); |
2427 CancelableTask task3(now_src_.get()); | 2449 CancelableTask task3(now_src_.get()); |
2428 CancelableTask task4(now_src_.get()); | 2450 CancelableTask task4(now_src_.get()); |
2429 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); | 2451 base::TimeDelta delay1(base::TimeDelta::FromSeconds(5)); |
2430 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); | 2452 base::TimeDelta delay2(base::TimeDelta::FromSeconds(10)); |
2431 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); | 2453 base::TimeDelta delay3(base::TimeDelta::FromSeconds(15)); |
2432 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); | 2454 base::TimeDelta delay4(base::TimeDelta::FromSeconds(30)); |
2433 std::vector<base::TimeTicks> run_times; | 2455 std::vector<base::TimeTicks> run_times; |
2434 runners_[0]->PostDelayedTask( | 2456 runners_[0]->PostDelayedTask( |
2435 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2457 FROM_HERE, |
2436 task1.weak_factory_.GetWeakPtr(), &run_times), | 2458 base::Bind(&CancelableTask::RecordTimeTask, |
| 2459 task1.weak_factory_.GetWeakPtr(), &run_times), |
2437 delay1); | 2460 delay1); |
2438 runners_[0]->PostDelayedTask( | 2461 runners_[0]->PostDelayedTask( |
2439 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2462 FROM_HERE, |
2440 task2.weak_factory_.GetWeakPtr(), &run_times), | 2463 base::Bind(&CancelableTask::RecordTimeTask, |
| 2464 task2.weak_factory_.GetWeakPtr(), &run_times), |
2441 delay2); | 2465 delay2); |
2442 runners_[0]->PostDelayedTask( | 2466 runners_[0]->PostDelayedTask( |
2443 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2467 FROM_HERE, |
2444 task3.weak_factory_.GetWeakPtr(), &run_times), | 2468 base::Bind(&CancelableTask::RecordTimeTask, |
| 2469 task3.weak_factory_.GetWeakPtr(), &run_times), |
2445 delay3); | 2470 delay3); |
2446 runners_[0]->PostDelayedTask( | 2471 runners_[0]->PostDelayedTask( |
2447 FROM_HERE, base::Bind(&CancelableTask::RecordTimeTask, | 2472 FROM_HERE, |
2448 task4.weak_factory_.GetWeakPtr(), &run_times), | 2473 base::Bind(&CancelableTask::RecordTimeTask, |
| 2474 task4.weak_factory_.GetWeakPtr(), &run_times), |
2449 delay4); | 2475 delay4); |
2450 | 2476 |
2451 EXPECT_EQ(4u, runners_[0]->GetNumberOfPendingTasks()); | 2477 EXPECT_EQ(4u, runners_[0]->GetNumberOfPendingTasks()); |
2452 task2.weak_factory_.InvalidateWeakPtrs(); | 2478 task2.weak_factory_.InvalidateWeakPtrs(); |
2453 task3.weak_factory_.InvalidateWeakPtrs(); | 2479 task3.weak_factory_.InvalidateWeakPtrs(); |
2454 EXPECT_EQ(4u, runners_[0]->GetNumberOfPendingTasks()); | 2480 EXPECT_EQ(4u, runners_[0]->GetNumberOfPendingTasks()); |
2455 | 2481 |
2456 manager_->SweepCanceledDelayedTasks(); | 2482 manager_->SweepCanceledDelayedTasks(); |
2457 EXPECT_EQ(2u, runners_[0]->GetNumberOfPendingTasks()); | 2483 EXPECT_EQ(2u, runners_[0]->GetNumberOfPendingTasks()); |
2458 | 2484 |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2852 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); | 2878 runners_[0]->PostTask(FROM_HERE, base::Bind(&NopTask)); |
2853 EXPECT_EQ(start_time + delay2, runners_[0]->GetNextScheduledWakeUp()); | 2879 EXPECT_EQ(start_time + delay2, runners_[0]->GetNextScheduledWakeUp()); |
2854 | 2880 |
2855 // Neither should fences. | 2881 // Neither should fences. |
2856 runners_[0]->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME); | 2882 runners_[0]->InsertFence(TaskQueue::InsertFencePosition::BEGINNING_OF_TIME); |
2857 EXPECT_EQ(start_time + delay2, runners_[0]->GetNextScheduledWakeUp()); | 2883 EXPECT_EQ(start_time + delay2, runners_[0]->GetNextScheduledWakeUp()); |
2858 } | 2884 } |
2859 | 2885 |
2860 } // namespace scheduler | 2886 } // namespace scheduler |
2861 } // namespace blink | 2887 } // namespace blink |
OLD | NEW |