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 |