| 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 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 std::vector<EnqueueOrder> run_order; | 438 std::vector<EnqueueOrder> run_order; |
| 439 // Posting a task when pumping is disabled doesn't result in work getting | 439 // Posting a task when pumping is disabled doesn't result in work getting |
| 440 // posted. | 440 // posted. |
| 441 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 441 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 442 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); | 442 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
| 443 | 443 |
| 444 // However polling still works. | 444 // However polling still works. |
| 445 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); | 445 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); |
| 446 | 446 |
| 447 // After pumping the task runs normally. | 447 // After pumping the task runs normally. |
| 448 runners_[0]->PumpQueue(true); | 448 LazyNow lazy_now(now_src_.get()); |
| 449 runners_[0]->PumpQueue(&lazy_now, true); |
| 449 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 450 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 450 test_task_runner_->RunUntilIdle(); | 451 test_task_runner_->RunUntilIdle(); |
| 451 EXPECT_THAT(run_order, ElementsAre(1)); | 452 EXPECT_THAT(run_order, ElementsAre(1)); |
| 452 } | 453 } |
| 453 | 454 |
| 454 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { | 455 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { |
| 455 Initialize(1u); | 456 Initialize(1u); |
| 456 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 457 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 457 | 458 |
| 458 std::vector<EnqueueOrder> run_order; | 459 std::vector<EnqueueOrder> run_order; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 521 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 521 | 522 |
| 522 std::vector<EnqueueOrder> run_order; | 523 std::vector<EnqueueOrder> run_order; |
| 523 // Posting a delayed task when pumping will apply the delay, but won't cause | 524 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 524 // work to executed afterwards. | 525 // work to executed afterwards. |
| 525 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 526 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 526 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 527 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 527 delay); | 528 delay); |
| 528 | 529 |
| 529 // After pumping but before the delay period has expired, task does not run. | 530 // After pumping but before the delay period has expired, task does not run. |
| 530 runners_[0]->PumpQueue(true); | 531 LazyNow lazy_now1(now_src_.get()); |
| 532 runners_[0]->PumpQueue(&lazy_now1, true); |
| 531 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); | 533 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 532 EXPECT_TRUE(run_order.empty()); | 534 EXPECT_TRUE(run_order.empty()); |
| 533 | 535 |
| 534 // Once the delay has expired, pumping causes the task to run. | 536 // Once the delay has expired, pumping causes the task to run. |
| 535 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); | 537 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); |
| 536 runners_[0]->PumpQueue(true); | 538 LazyNow lazy_now2(now_src_.get()); |
| 539 runners_[0]->PumpQueue(&lazy_now2, true); |
| 537 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 540 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 538 test_task_runner_->RunPendingTasks(); | 541 test_task_runner_->RunPendingTasks(); |
| 539 EXPECT_THAT(run_order, ElementsAre(1)); | 542 EXPECT_THAT(run_order, ElementsAre(1)); |
| 540 } | 543 } |
| 541 | 544 |
| 542 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { | 545 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { |
| 543 Initialize(1u); | 546 Initialize(1u); |
| 544 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 547 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 545 | 548 |
| 546 std::vector<EnqueueOrder> run_order; | 549 std::vector<EnqueueOrder> run_order; |
| 547 // Posting a delayed task when pumping will apply the delay, but won't cause | 550 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 548 // work to executed afterwards. | 551 // work to executed afterwards. |
| 549 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); | 552 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); |
| 550 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); | 553 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); |
| 551 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); | 554 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); |
| 552 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 555 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 553 delay1); | 556 delay1); |
| 554 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 557 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 555 delay2); | 558 delay2); |
| 556 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), | 559 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 557 delay3); | 560 delay3); |
| 558 | 561 |
| 559 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); | 562 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); |
| 560 test_task_runner_->RunUntilIdle(); | 563 test_task_runner_->RunUntilIdle(); |
| 561 EXPECT_TRUE(run_order.empty()); | 564 EXPECT_TRUE(run_order.empty()); |
| 562 | 565 |
| 563 // Once the delay has expired, pumping causes the task to run. | 566 // Once the delay has expired, pumping causes the task to run. |
| 564 runners_[0]->PumpQueue(true); | 567 LazyNow lazy_now(now_src_.get()); |
| 568 runners_[0]->PumpQueue(&lazy_now, true); |
| 565 test_task_runner_->RunUntilIdle(); | 569 test_task_runner_->RunUntilIdle(); |
| 566 EXPECT_THAT(run_order, ElementsAre(1, 2)); | 570 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
| 567 } | 571 } |
| 568 | 572 |
| 569 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { | 573 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { |
| 570 Initialize(1u); | 574 Initialize(1u); |
| 571 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 575 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 572 | 576 |
| 573 std::vector<EnqueueOrder> run_order; | 577 std::vector<EnqueueOrder> run_order; |
| 574 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 578 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 575 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 579 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 576 delay); | 580 delay); |
| 577 | 581 |
| 578 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); | 582 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); |
| 579 EXPECT_TRUE(run_order.empty()); | 583 EXPECT_TRUE(run_order.empty()); |
| 580 } | 584 } |
| 581 | 585 |
| 582 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { | 586 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { |
| 583 Initialize(1u); | 587 Initialize(1u); |
| 584 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 588 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 585 | 589 |
| 586 std::vector<EnqueueOrder> run_order; | 590 std::vector<EnqueueOrder> run_order; |
| 587 // Posting two tasks and pumping twice should result in two tasks in the work | 591 // Posting two tasks and pumping twice should result in two tasks in the work |
| 588 // queue. | 592 // queue. |
| 593 LazyNow lazy_now(now_src_.get()); |
| 589 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 594 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 590 runners_[0]->PumpQueue(true); | 595 runners_[0]->PumpQueue(&lazy_now, true); |
| 591 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 596 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 592 runners_[0]->PumpQueue(true); | 597 runners_[0]->PumpQueue(&lazy_now, true); |
| 593 | 598 |
| 594 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); | 599 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); |
| 595 } | 600 } |
| 596 | 601 |
| 597 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 602 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 598 int countdown, | 603 int countdown, |
| 599 std::vector<EnqueueOrder>* out_result) { | 604 std::vector<EnqueueOrder>* out_result) { |
| 600 out_result->push_back(countdown); | 605 out_result->push_back(countdown); |
| 601 if (--countdown) { | 606 if (--countdown) { |
| 602 runner->PostTask(FROM_HERE, | 607 runner->PostTask(FROM_HERE, |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 std::vector<EnqueueOrder> run_order; | 754 std::vector<EnqueueOrder> run_order; |
| 750 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 755 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 751 test_task_runner_->RunUntilIdle(); | 756 test_task_runner_->RunUntilIdle(); |
| 752 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. | 757 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. |
| 753 | 758 |
| 754 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 759 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 755 test_task_runner_->RunUntilIdle(); | 760 test_task_runner_->RunUntilIdle(); |
| 756 // This still shouldn't wake TQM as manual queue was not pumped. | 761 // This still shouldn't wake TQM as manual queue was not pumped. |
| 757 EXPECT_TRUE(run_order.empty()); | 762 EXPECT_TRUE(run_order.empty()); |
| 758 | 763 |
| 759 runners_[1]->PumpQueue(true); | 764 LazyNow lazy_now(now_src_.get()); |
| 765 runners_[1]->PumpQueue(&lazy_now, true); |
| 760 test_task_runner_->RunUntilIdle(); | 766 test_task_runner_->RunUntilIdle(); |
| 761 // Executing a task on an auto pumped queue should wake the TQM. | 767 // Executing a task on an auto pumped queue should wake the TQM. |
| 762 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 768 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 763 } | 769 } |
| 764 | 770 |
| 765 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 771 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 766 base::Closure task) { | 772 base::Closure task) { |
| 767 task_runner->PostTask(FROM_HERE, task); | 773 task_runner->PostTask(FROM_HERE, task); |
| 768 } | 774 } |
| 769 | 775 |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 | 1088 |
| 1083 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); | 1089 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); |
| 1084 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); | 1090 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); |
| 1085 EXPECT_TRUE(queue0->HasPendingImmediateWork()); | 1091 EXPECT_TRUE(queue0->HasPendingImmediateWork()); |
| 1086 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1092 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1087 | 1093 |
| 1088 test_task_runner_->RunUntilIdle(); | 1094 test_task_runner_->RunUntilIdle(); |
| 1089 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1095 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1090 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1096 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1091 | 1097 |
| 1092 queue1->PumpQueue(true); | 1098 LazyNow lazy_now(now_src_.get()); |
| 1099 queue1->PumpQueue(&lazy_now, true); |
| 1093 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1100 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1094 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1101 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1095 | 1102 |
| 1096 test_task_runner_->RunUntilIdle(); | 1103 test_task_runner_->RunUntilIdle(); |
| 1097 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1104 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1098 EXPECT_FALSE(queue1->HasPendingImmediateWork()); | 1105 EXPECT_FALSE(queue1->HasPendingImmediateWork()); |
| 1099 } | 1106 } |
| 1100 | 1107 |
| 1101 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { | 1108 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { |
| 1102 Initialize(2u); | 1109 Initialize(2u); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1125 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1132 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1126 EXPECT_TRUE(queue1->NeedsPumping()); | 1133 EXPECT_TRUE(queue1->NeedsPumping()); |
| 1127 | 1134 |
| 1128 test_task_runner_->ClearRunTaskLimit(); | 1135 test_task_runner_->ClearRunTaskLimit(); |
| 1129 test_task_runner_->RunUntilIdle(); | 1136 test_task_runner_->RunUntilIdle(); |
| 1130 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1137 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1131 EXPECT_FALSE(queue0->NeedsPumping()); | 1138 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1132 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1139 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1133 EXPECT_TRUE(queue1->NeedsPumping()); | 1140 EXPECT_TRUE(queue1->NeedsPumping()); |
| 1134 | 1141 |
| 1135 queue1->PumpQueue(true); | 1142 LazyNow lazy_now(now_src_.get()); |
| 1143 queue1->PumpQueue(&lazy_now, true); |
| 1136 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1144 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1137 EXPECT_FALSE(queue0->NeedsPumping()); | 1145 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1138 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1146 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1139 EXPECT_FALSE(queue1->NeedsPumping()); | 1147 EXPECT_FALSE(queue1->NeedsPumping()); |
| 1140 | 1148 |
| 1141 test_task_runner_->RunUntilIdle(); | 1149 test_task_runner_->RunUntilIdle(); |
| 1142 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1150 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1143 EXPECT_FALSE(queue0->NeedsPumping()); | 1151 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1144 EXPECT_FALSE(queue1->HasPendingImmediateWork()); | 1152 EXPECT_FALSE(queue1->HasPendingImmediateWork()); |
| 1145 EXPECT_FALSE(queue1->NeedsPumping()); | 1153 EXPECT_FALSE(queue1->NeedsPumping()); |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1966 | 1974 |
| 1967 trace_analyzer::TraceEventVector events; | 1975 trace_analyzer::TraceEventVector events; |
| 1968 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || | 1976 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || |
| 1969 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); | 1977 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); |
| 1970 analyzer->FindEvents(q, &events); | 1978 analyzer->FindEvents(q, &events); |
| 1971 | 1979 |
| 1972 EXPECT_EQ(2u, events.size()); | 1980 EXPECT_EQ(2u, events.size()); |
| 1973 } | 1981 } |
| 1974 | 1982 |
| 1975 } // namespace scheduler | 1983 } // namespace scheduler |
| OLD | NEW |