| 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 "content/renderer/scheduler/task_queue_manager.h" | 5 #include "content/child/scheduler/task_queue_manager.h" |
| 6 | 6 |
| 7 #include "base/threading/thread.h" | 7 #include "base/threading/thread.h" |
| 8 #include "cc/test/ordered_simple_task_runner.h" | 8 #include "cc/test/ordered_simple_task_runner.h" |
| 9 #include "cc/test/test_now_source.h" | 9 #include "cc/test/test_now_source.h" |
| 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" | 10 #include "content/child/scheduler/nestable_task_runner_for_test.h" |
| 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" | 11 #include "content/child/scheduler/scheduler_message_loop_delegate.h" |
| 12 #include "content/renderer/scheduler/task_queue_selector.h" | 12 #include "content/child/scheduler/task_queue_selector.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 14 | 14 |
| 15 using testing::ElementsAre; | 15 using testing::ElementsAre; |
| 16 using testing::_; | 16 using testing::_; |
| 17 | 17 |
| 18 namespace content { | 18 namespace content { |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 class SelectorForTest : public TaskQueueSelector { | 21 class SelectorForTest : public TaskQueueSelector { |
| 22 public: | 22 public: |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 Explicit, | 104 Explicit, |
| 105 }; | 105 }; |
| 106 | 106 |
| 107 void Initialize(size_t num_queues, SelectorType type) { | 107 void Initialize(size_t num_queues, SelectorType type) { |
| 108 now_src_ = cc::TestNowSource::Create(1000); | 108 now_src_ = cc::TestNowSource::Create(1000); |
| 109 test_task_runner_ = | 109 test_task_runner_ = |
| 110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false)); | 110 make_scoped_refptr(new cc::OrderedSimpleTaskRunner(now_src_, false)); |
| 111 selector_ = make_scoped_ptr(createSelectorForTest(type)); | 111 selector_ = make_scoped_ptr(createSelectorForTest(type)); |
| 112 manager_ = make_scoped_ptr(new TaskQueueManager( | 112 manager_ = make_scoped_ptr(new TaskQueueManager( |
| 113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), | 113 num_queues, NestableTaskRunnerForTest::Create(test_task_runner_.get()), |
| 114 selector_.get())); | 114 selector_.get(), "test.scheduler")); |
| 115 manager_->SetTimeSourceForTesting(now_src_); | 115 manager_->SetTimeSourceForTesting(now_src_); |
| 116 | 116 |
| 117 EXPECT_EQ(num_queues, selector_->work_queues().size()); | 117 EXPECT_EQ(num_queues, selector_->work_queues().size()); |
| 118 } | 118 } |
| 119 | 119 |
| 120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) { | 120 void InitializeWithRealMessageLoop(size_t num_queues, SelectorType type) { |
| 121 message_loop_.reset(new base::MessageLoop()); | 121 message_loop_.reset(new base::MessageLoop()); |
| 122 selector_ = make_scoped_ptr(createSelectorForTest(type)); | 122 selector_ = make_scoped_ptr(createSelectorForTest(type)); |
| 123 manager_ = make_scoped_ptr(new TaskQueueManager( | 123 manager_ = make_scoped_ptr(new TaskQueueManager( |
| 124 num_queues, | 124 num_queues, SchedulerMessageLoopDelegate::Create(message_loop_.get()), |
| 125 RendererSchedulerMessageLoopDelegate::Create(message_loop_.get()), | 125 selector_.get(), "test.scheduler")); |
| 126 selector_.get())); | |
| 127 EXPECT_EQ(num_queues, selector_->work_queues().size()); | 126 EXPECT_EQ(num_queues, selector_->work_queues().size()); |
| 128 } | 127 } |
| 129 | 128 |
| 130 SelectorForTest* createSelectorForTest(SelectorType type) { | 129 SelectorForTest* createSelectorForTest(SelectorType type) { |
| 131 switch (type) { | 130 switch (type) { |
| 132 case SelectorType::Automatic: | 131 case SelectorType::Automatic: |
| 133 return new AutomaticSelectorForTest(); | 132 return new AutomaticSelectorForTest(); |
| 134 | 133 |
| 135 case SelectorType::Explicit: | 134 case SelectorType::Explicit: |
| 136 return new ExplicitSelectorForTest(); | 135 return new ExplicitSelectorForTest(); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 280 |
| 282 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; | 281 std::vector<std::pair<base::Closure, bool>> tasks_to_post_from_nested_loop; |
| 283 tasks_to_post_from_nested_loop.push_back( | 282 tasks_to_post_from_nested_loop.push_back( |
| 284 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); | 283 std::make_pair(base::Bind(&TestTask, 3, &run_order), false)); |
| 285 tasks_to_post_from_nested_loop.push_back( | 284 tasks_to_post_from_nested_loop.push_back( |
| 286 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); | 285 std::make_pair(base::Bind(&TestTask, 4, &run_order), true)); |
| 287 tasks_to_post_from_nested_loop.push_back( | 286 tasks_to_post_from_nested_loop.push_back( |
| 288 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); | 287 std::make_pair(base::Bind(&TestTask, 5, &run_order), true)); |
| 289 | 288 |
| 290 runner->PostTask( | 289 runner->PostTask( |
| 291 FROM_HERE, | 290 FROM_HERE, base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, |
| 292 base::Bind(&PostFromNestedRunloop, message_loop_.get(), runner, | 291 base::Unretained(&tasks_to_post_from_nested_loop))); |
| 293 base::Unretained(&tasks_to_post_from_nested_loop))); | |
| 294 | 292 |
| 295 message_loop_->RunUntilIdle(); | 293 message_loop_->RunUntilIdle(); |
| 296 // Note we expect task 3 to run last because it's non-nestable. | 294 // Note we expect task 3 to run last because it's non-nestable. |
| 297 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); | 295 EXPECT_THAT(run_order, ElementsAre(1, 2, 4, 5, 3)); |
| 298 } | 296 } |
| 299 | 297 |
| 300 TEST_F(TaskQueueManagerTest, QueuePolling) { | 298 TEST_F(TaskQueueManagerTest, QueuePolling) { |
| 301 Initialize(1u, SelectorType::Automatic); | 299 Initialize(1u, SelectorType::Automatic); |
| 302 | 300 |
| 303 std::vector<int> run_order; | 301 std::vector<int> run_order; |
| 304 scoped_refptr<base::SingleThreadTaskRunner> runner = | 302 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 305 manager_->TaskRunnerForQueue(0); | 303 manager_->TaskRunnerForQueue(0); |
| 306 | 304 |
| 307 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 305 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 308 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 306 runner->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 309 EXPECT_FALSE(manager_->IsQueueEmpty(0)); | 307 EXPECT_FALSE(manager_->IsQueueEmpty(0)); |
| 310 | 308 |
| 311 test_task_runner_->RunUntilIdle(); | 309 test_task_runner_->RunUntilIdle(); |
| 312 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 310 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 313 } | 311 } |
| 314 | 312 |
| 315 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { | 313 TEST_F(TaskQueueManagerTest, DelayedTaskPosting) { |
| 316 Initialize(1u, SelectorType::Automatic); | 314 Initialize(1u, SelectorType::Automatic); |
| 317 | 315 |
| 318 std::vector<int> run_order; | 316 std::vector<int> run_order; |
| 319 scoped_refptr<base::SingleThreadTaskRunner> runner = | 317 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 320 manager_->TaskRunnerForQueue(0); | 318 manager_->TaskRunnerForQueue(0); |
| 321 | 319 |
| 322 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 320 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 323 runner->PostDelayedTask( | 321 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 324 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); | 322 delay); |
| 325 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); | 323 EXPECT_EQ(delay, test_task_runner_->DelayToNextTaskTime()); |
| 326 EXPECT_TRUE(manager_->IsQueueEmpty(0)); | 324 EXPECT_TRUE(manager_->IsQueueEmpty(0)); |
| 327 EXPECT_TRUE(run_order.empty()); | 325 EXPECT_TRUE(run_order.empty()); |
| 328 | 326 |
| 329 // The task doesn't run before the delay has completed. | 327 // The task doesn't run before the delay has completed. |
| 330 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); | 328 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(9)); |
| 331 EXPECT_TRUE(run_order.empty()); | 329 EXPECT_TRUE(run_order.empty()); |
| 332 | 330 |
| 333 // After the delay has completed, the task runs normally. | 331 // After the delay has completed, the task runs normally. |
| 334 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); | 332 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(1)); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 Initialize(1u, SelectorType::Automatic); | 513 Initialize(1u, SelectorType::Automatic); |
| 516 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); | 514 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::MANUAL); |
| 517 | 515 |
| 518 std::vector<int> run_order; | 516 std::vector<int> run_order; |
| 519 scoped_refptr<base::SingleThreadTaskRunner> runner = | 517 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 520 manager_->TaskRunnerForQueue(0); | 518 manager_->TaskRunnerForQueue(0); |
| 521 | 519 |
| 522 // Posting a delayed task when pumping will apply the delay, but won't cause | 520 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 523 // work to executed afterwards. | 521 // work to executed afterwards. |
| 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 522 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 525 runner->PostDelayedTask( | 523 runner->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 526 FROM_HERE, base::Bind(&TestTask, 1, &run_order), delay); | 524 delay); |
| 527 | 525 |
| 528 // After pumping but before the delay period has expired, task does not run. | 526 // After pumping but before the delay period has expired, task does not run. |
| 529 manager_->PumpQueue(0); | 527 manager_->PumpQueue(0); |
| 530 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); | 528 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 531 EXPECT_TRUE(run_order.empty()); | 529 EXPECT_TRUE(run_order.empty()); |
| 532 | 530 |
| 533 // Once the delay has expired, pumping causes the task to run. | 531 // Once the delay has expired, pumping causes the task to run. |
| 534 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5)); | 532 now_src_->AdvanceNow(base::TimeDelta::FromMilliseconds(5)); |
| 535 manager_->PumpQueue(0); | 533 manager_->PumpQueue(0); |
| 536 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 534 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); | 657 FROM_HERE, base::Bind(&PostTaskToRunner, runner, &run_order)); |
| 660 thread.Stop(); | 658 thread.Stop(); |
| 661 | 659 |
| 662 message_loop_->RunUntilIdle(); | 660 message_loop_->RunUntilIdle(); |
| 663 EXPECT_THAT(run_order, ElementsAre(1)); | 661 EXPECT_THAT(run_order, ElementsAre(1)); |
| 664 } | 662 } |
| 665 | 663 |
| 666 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 664 void RePostingTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 667 int* run_count) { | 665 int* run_count) { |
| 668 (*run_count)++; | 666 (*run_count)++; |
| 669 runner->PostTask( | 667 runner->PostTask(FROM_HERE, Bind(&RePostingTestTask, |
| 670 FROM_HERE, | 668 base::Unretained(runner.get()), run_count)); |
| 671 Bind(&RePostingTestTask, base::Unretained(runner.get()), run_count)); | |
| 672 } | 669 } |
| 673 | 670 |
| 674 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { | 671 TEST_F(TaskQueueManagerTest, DoWorkCantPostItselfMultipleTimes) { |
| 675 Initialize(1u, SelectorType::Automatic); | 672 Initialize(1u, SelectorType::Automatic); |
| 676 scoped_refptr<base::SingleThreadTaskRunner> runner = | 673 scoped_refptr<base::SingleThreadTaskRunner> runner = |
| 677 manager_->TaskRunnerForQueue(0); | 674 manager_->TaskRunnerForQueue(0); |
| 678 | 675 |
| 679 int run_count = 0; | 676 int run_count = 0; |
| 680 runner->PostTask(FROM_HERE, | 677 runner->PostTask(FROM_HERE, |
| 681 base::Bind(&RePostingTestTask, runner, &run_count)); | 678 base::Bind(&RePostingTestTask, runner, &run_count)); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 817 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 821 | 818 |
| 822 selector_->AppendQueueToService(1); | 819 selector_->AppendQueueToService(1); |
| 823 selector_->AppendQueueToService(1); | 820 selector_->AppendQueueToService(1); |
| 824 selector_->AppendQueueToService(0); | 821 selector_->AppendQueueToService(0); |
| 825 | 822 |
| 826 // Check that a task which posts a task to an auto pump after wakeup queue | 823 // Check that a task which posts a task to an auto pump after wakeup queue |
| 827 // doesn't cause the queue to wake up. | 824 // doesn't cause the queue to wake up. |
| 828 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); | 825 base::Closure after_wakeup_task = base::Bind(&TestTask, 1, &run_order); |
| 829 runners[1]->PostTask( | 826 runners[1]->PostTask( |
| 830 FROM_HERE, | 827 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); |
| 831 base::Bind(&TestPostingTask, runners[0], after_wakeup_task)); | |
| 832 test_task_runner_->RunUntilIdle(); | 828 test_task_runner_->RunUntilIdle(); |
| 833 EXPECT_TRUE(run_order.empty()); | 829 EXPECT_TRUE(run_order.empty()); |
| 834 | 830 |
| 835 // Wake up the queue. | 831 // Wake up the queue. |
| 836 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 832 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 837 test_task_runner_->RunUntilIdle(); | 833 test_task_runner_->RunUntilIdle(); |
| 838 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 834 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 839 } | 835 } |
| 840 | 836 |
| 841 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { | 837 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupFromMultipleTasks) { |
| 842 Initialize(2u, SelectorType::Explicit); | 838 Initialize(2u, SelectorType::Explicit); |
| 843 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); | 839 manager_->SetPumpPolicy(0, TaskQueueManager::PumpPolicy::AFTER_WAKEUP); |
| 844 | 840 |
| 845 std::vector<int> run_order; | 841 std::vector<int> run_order; |
| 846 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { | 842 scoped_refptr<base::SingleThreadTaskRunner> runners[2] = { |
| 847 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; | 843 manager_->TaskRunnerForQueue(0), manager_->TaskRunnerForQueue(1)}; |
| 848 | 844 |
| 849 selector_->AppendQueueToService(1); | 845 selector_->AppendQueueToService(1); |
| 850 selector_->AppendQueueToService(1); | 846 selector_->AppendQueueToService(1); |
| 851 selector_->AppendQueueToService(1); | 847 selector_->AppendQueueToService(1); |
| 852 selector_->AppendQueueToService(0); | 848 selector_->AppendQueueToService(0); |
| 853 selector_->AppendQueueToService(0); | 849 selector_->AppendQueueToService(0); |
| 854 | 850 |
| 855 // Check that a task which posts a task to an auto pump after wakeup queue | 851 // Check that a task which posts a task to an auto pump after wakeup queue |
| 856 // doesn't cause the queue to wake up. | 852 // doesn't cause the queue to wake up. |
| 857 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order); | 853 base::Closure after_wakeup_task_1 = base::Bind(&TestTask, 1, &run_order); |
| 858 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order); | 854 base::Closure after_wakeup_task_2 = base::Bind(&TestTask, 2, &run_order); |
| 859 runners[1]->PostTask( | 855 runners[1]->PostTask( |
| 860 FROM_HERE, | 856 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1)); |
| 861 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_1)); | |
| 862 runners[1]->PostTask( | 857 runners[1]->PostTask( |
| 863 FROM_HERE, | 858 FROM_HERE, base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); |
| 864 base::Bind(&TestPostingTask, runners[0], after_wakeup_task_2)); | |
| 865 test_task_runner_->RunUntilIdle(); | 859 test_task_runner_->RunUntilIdle(); |
| 866 EXPECT_TRUE(run_order.empty()); | 860 EXPECT_TRUE(run_order.empty()); |
| 867 | 861 |
| 868 // Wake up the queue. | 862 // Wake up the queue. |
| 869 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); | 863 runners[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order)); |
| 870 test_task_runner_->RunUntilIdle(); | 864 test_task_runner_->RunUntilIdle(); |
| 871 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); | 865 EXPECT_THAT(run_order, ElementsAre(3, 1, 2)); |
| 872 } | 866 } |
| 873 | 867 |
| 874 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { | 868 TEST_F(TaskQueueManagerTest, AutoPumpAfterWakeupBecomesQuiescent) { |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1); | 1029 runners[0]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay1); |
| 1036 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2); | 1030 runners[1]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay2); |
| 1037 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3); | 1031 runners[2]->PostDelayedTask(FROM_HERE, base::Bind(&NopTask), delay3); |
| 1038 | 1032 |
| 1039 EXPECT_EQ(now_src_->Now() + delay2, | 1033 EXPECT_EQ(now_src_->Now() + delay2, |
| 1040 manager_->NextPendingDelayedTaskRunTime()); | 1034 manager_->NextPendingDelayedTaskRunTime()); |
| 1041 } | 1035 } |
| 1042 | 1036 |
| 1043 } // namespace | 1037 } // namespace |
| 1044 } // namespace content | 1038 } // namespace content |
| 1045 | |
| OLD | NEW |