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 <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/location.h" | 10 #include "base/location.h" |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 | 202 |
203 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 203 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
204 tasks_to_post_from_nested_loop.push_back( | 204 tasks_to_post_from_nested_loop.push_back( |
205 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); | 205 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); |
206 tasks_to_post_from_nested_loop.push_back( | 206 tasks_to_post_from_nested_loop.push_back( |
207 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); | 207 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); |
208 tasks_to_post_from_nested_loop.push_back( | 208 tasks_to_post_from_nested_loop.push_back( |
209 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); | 209 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); |
210 | 210 |
211 runners_[0]->PostTask( | 211 runners_[0]->PostTask( |
212 FROM_HERE, | 212 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
213 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runners_[0], | 213 base::RetainedRef(runners_[0]), |
214 base::Unretained(&tasks_to_post_from_nested_loop))); | 214 base::Unretained(&tasks_to_post_from_nested_loop))); |
215 | 215 |
216 message_loop_->RunUntilIdle(); | 216 message_loop_->RunUntilIdle(); |
217 // Note we expect task 3 to run last because it's non-nestable. | 217 // Note we expect task 3 to run last because it's non-nestable. |
218 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); | 218 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
219 } | 219 } |
220 | 220 |
221 TEST_F(TaskQueueManagerTest, QueuePolling) { | 221 TEST_F(TaskQueueManagerTest, QueuePolling) { |
222 Initialize(1u); | 222 Initialize(1u); |
223 | 223 |
224 std::vector<EnqueueOrder> run_order; | 224 std::vector<EnqueueOrder> run_order; |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { | 610 TEST_F(TaskQueueManagerTest, PostFromNestedRunloop) { |
611 InitializeWithRealMessageLoop(1u); | 611 InitializeWithRealMessageLoop(1u); |
612 | 612 |
613 std::vector<EnqueueOrder> run_order; | 613 std::vector<EnqueueOrder> run_order; |
614 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 614 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
615 tasks_to_post_from_nested_loop.push_back( | 615 tasks_to_post_from_nested_loop.push_back( |
616 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); | 616 std::make_pair(base::Bind(&TestTask, 1, &run_order), true)); |
617 | 617 |
618 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); | 618 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 0, &run_order)); |
619 runners_[0]->PostTask( | 619 runners_[0]->PostTask( |
620 FROM_HERE, | 620 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
621 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runners_[0], | 621 base::RetainedRef(runners_[0]), |
622 base::Unretained(&tasks_to_post_from_nested_loop))); | 622 base::Unretained(&tasks_to_post_from_nested_loop))); |
623 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 623 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
624 | 624 |
625 message_loop_->RunUntilIdle(); | 625 message_loop_->RunUntilIdle(); |
626 | 626 |
627 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); | 627 EXPECT_THAT(run_order, ElementsAre(0, 2, 1)); |
628 } | 628 } |
629 | 629 |
630 TEST_F(TaskQueueManagerTest, WorkBatching) { | 630 TEST_F(TaskQueueManagerTest, WorkBatching) { |
631 Initialize(1u); | 631 Initialize(1u); |
632 | 632 |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 } | 1189 } |
1190 | 1190 |
1191 TEST_F(TaskQueueManagerTest, QuitWhileNested) { | 1191 TEST_F(TaskQueueManagerTest, QuitWhileNested) { |
1192 // This test makes sure we don't continue running a work batch after a nested | 1192 // This test makes sure we don't continue running a work batch after a nested |
1193 // run loop has been exited in the middle of the batch. | 1193 // run loop has been exited in the middle of the batch. |
1194 InitializeWithRealMessageLoop(1u); | 1194 InitializeWithRealMessageLoop(1u); |
1195 manager_->SetWorkBatchSize(2); | 1195 manager_->SetWorkBatchSize(2); |
1196 | 1196 |
1197 bool was_nested = true; | 1197 bool was_nested = true; |
1198 base::RunLoop run_loop; | 1198 base::RunLoop run_loop; |
1199 runners_[0]->PostTask( | 1199 runners_[0]->PostTask(FROM_HERE, base::Bind(&PostAndQuitFromNestedRunloop, |
1200 FROM_HERE, | 1200 base::Unretained(&run_loop), |
1201 base::Bind(&PostAndQuitFromNestedRunloop, base::Unretained(&run_loop), | 1201 base::RetainedRef(runners_[0]), |
1202 runners_[0], base::Unretained(&was_nested))); | 1202 base::Unretained(&was_nested))); |
1203 | 1203 |
1204 message_loop_->RunUntilIdle(); | 1204 message_loop_->RunUntilIdle(); |
1205 EXPECT_FALSE(was_nested); | 1205 EXPECT_FALSE(was_nested); |
1206 } | 1206 } |
1207 | 1207 |
1208 class SequenceNumberCapturingTaskObserver | 1208 class SequenceNumberCapturingTaskObserver |
1209 : public base::MessageLoop::TaskObserver { | 1209 : public base::MessageLoop::TaskObserver { |
1210 public: | 1210 public: |
1211 // MessageLoop::TaskObserver overrides. | 1211 // MessageLoop::TaskObserver overrides. |
1212 void WillProcessTask(const base::PendingTask& pending_task) override {} | 1212 void WillProcessTask(const base::PendingTask& pending_task) override {} |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1449 base::Unretained(task_queue.get())), | 1449 base::Unretained(task_queue.get())), |
1450 true)); | 1450 true)); |
1451 tasks_to_post_from_nested_loop.push_back(std::make_pair( | 1451 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
1452 base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue, | 1452 base::Bind(&internal::TaskQueueImpl::UnregisterTaskQueue, |
1453 base::Unretained(task_queue.get())), true)); | 1453 base::Unretained(task_queue.get())), true)); |
1454 tasks_to_post_from_nested_loop.push_back( | 1454 tasks_to_post_from_nested_loop.push_back( |
1455 std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), | 1455 std::make_pair(base::Bind(&HasOneRefTask, base::Unretained(&log), |
1456 base::Unretained(task_queue.get())), | 1456 base::Unretained(task_queue.get())), |
1457 true)); | 1457 true)); |
1458 runners_[0]->PostTask( | 1458 runners_[0]->PostTask( |
1459 FROM_HERE, | 1459 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), |
1460 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runners_[0], | 1460 base::RetainedRef(runners_[0]), |
1461 base::Unretained(&tasks_to_post_from_nested_loop))); | 1461 base::Unretained(&tasks_to_post_from_nested_loop))); |
1462 message_loop_->RunUntilIdle(); | 1462 message_loop_->RunUntilIdle(); |
1463 | 1463 |
1464 // Add a final call to HasOneRefTask. This gives the manager a chance to | 1464 // Add a final call to HasOneRefTask. This gives the manager a chance to |
1465 // release its reference, and checks that it has. | 1465 // release its reference, and checks that it has. |
1466 runners_[0]->PostTask(FROM_HERE, | 1466 runners_[0]->PostTask(FROM_HERE, |
1467 base::Bind(&HasOneRefTask, base::Unretained(&log), | 1467 base::Bind(&HasOneRefTask, base::Unretained(&log), |
1468 base::Unretained(task_queue.get()))); | 1468 base::Unretained(task_queue.get()))); |
1469 message_loop_->RunUntilIdle(); | 1469 message_loop_->RunUntilIdle(); |
1470 | 1470 |
1471 EXPECT_THAT(log, ElementsAre(false, false, true)); | 1471 EXPECT_THAT(log, ElementsAre(false, false, true)); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1836 FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, | 1836 FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, |
1837 message_loop_.get(), manager_.get(), &task_sources, | 1837 message_loop_.get(), manager_.get(), &task_sources, |
1838 &tasks_to_post_from_nested_loop)); | 1838 &tasks_to_post_from_nested_loop)); |
1839 | 1839 |
1840 message_loop_->RunUntilIdle(); | 1840 message_loop_->RunUntilIdle(); |
1841 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); | 1841 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); |
1842 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); | 1842 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
1843 } | 1843 } |
1844 | 1844 |
1845 } // namespace scheduler | 1845 } // namespace scheduler |
OLD | NEW |