| 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 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 std::vector<EnqueueOrder> run_order; | 384 std::vector<EnqueueOrder> run_order; |
| 385 // Posting a task when pumping is disabled doesn't result in work getting | 385 // Posting a task when pumping is disabled doesn't result in work getting |
| 386 // posted. | 386 // posted. |
| 387 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 387 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 388 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); | 388 EXPECT_FALSE(test_task_runner_->HasPendingTasks()); |
| 389 | 389 |
| 390 // However polling still works. | 390 // However polling still works. |
| 391 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); | 391 EXPECT_TRUE(runners_[0]->HasPendingImmediateWork()); |
| 392 | 392 |
| 393 // After pumping the task runs normally. | 393 // After pumping the task runs normally. |
| 394 runners_[0]->PumpQueue(true); | 394 LazyNow lazy_now(now_src_.get()); |
| 395 runners_[0]->PumpQueue(&lazy_now, true); |
| 395 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 396 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 396 test_task_runner_->RunUntilIdle(); | 397 test_task_runner_->RunUntilIdle(); |
| 397 EXPECT_THAT(run_order, ElementsAre(1)); | 398 EXPECT_THAT(run_order, ElementsAre(1)); |
| 398 } | 399 } |
| 399 | 400 |
| 400 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { | 401 TEST_F(TaskQueueManagerTest, ManualPumpingToggle) { |
| 401 Initialize(1u); | 402 Initialize(1u); |
| 402 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 403 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 403 | 404 |
| 404 std::vector<EnqueueOrder> run_order; | 405 std::vector<EnqueueOrder> run_order; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 467 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 467 | 468 |
| 468 std::vector<EnqueueOrder> run_order; | 469 std::vector<EnqueueOrder> run_order; |
| 469 // Posting a delayed task when pumping will apply the delay, but won't cause | 470 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 470 // work to executed afterwards. | 471 // work to executed afterwards. |
| 471 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 472 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 472 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 473 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 473 delay); | 474 delay); |
| 474 | 475 |
| 475 // After pumping but before the delay period has expired, task does not run. | 476 // After pumping but before the delay period has expired, task does not run. |
| 476 runners_[0]->PumpQueue(true); | 477 LazyNow lazy_now1(now_src_.get()); |
| 478 runners_[0]->PumpQueue(&lazy_now1, true); |
| 477 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); | 479 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(5)); |
| 478 EXPECT_TRUE(run_order.empty()); | 480 EXPECT_TRUE(run_order.empty()); |
| 479 | 481 |
| 480 // Once the delay has expired, pumping causes the task to run. | 482 // Once the delay has expired, pumping causes the task to run. |
| 481 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); | 483 now_src_->Advance(base::TimeDelta::FromMilliseconds(5)); |
| 482 runners_[0]->PumpQueue(true); | 484 LazyNow lazy_now2(now_src_.get()); |
| 485 runners_[0]->PumpQueue(&lazy_now2, true); |
| 483 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); | 486 EXPECT_TRUE(test_task_runner_->HasPendingTasks()); |
| 484 test_task_runner_->RunPendingTasks(); | 487 test_task_runner_->RunPendingTasks(); |
| 485 EXPECT_THAT(run_order, ElementsAre(1)); | 488 EXPECT_THAT(run_order, ElementsAre(1)); |
| 486 } | 489 } |
| 487 | 490 |
| 488 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { | 491 TEST_F(TaskQueueManagerTest, ManualPumpingWithMultipleDelayedTasks) { |
| 489 Initialize(1u); | 492 Initialize(1u); |
| 490 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 493 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 491 | 494 |
| 492 std::vector<EnqueueOrder> run_order; | 495 std::vector<EnqueueOrder> run_order; |
| 493 // Posting a delayed task when pumping will apply the delay, but won't cause | 496 // Posting a delayed task when pumping will apply the delay, but won't cause |
| 494 // work to executed afterwards. | 497 // work to executed afterwards. |
| 495 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); | 498 base::TimeDelta delay1(base::TimeDelta::FromMilliseconds(1)); |
| 496 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); | 499 base::TimeDelta delay2(base::TimeDelta::FromMilliseconds(10)); |
| 497 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); | 500 base::TimeDelta delay3(base::TimeDelta::FromMilliseconds(20)); |
| 498 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 501 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 499 delay1); | 502 delay1); |
| 500 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), | 503 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order), |
| 501 delay2); | 504 delay2); |
| 502 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), | 505 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 3, &run_order), |
| 503 delay3); | 506 delay3); |
| 504 | 507 |
| 505 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); | 508 now_src_->Advance(base::TimeDelta::FromMilliseconds(15)); |
| 506 test_task_runner_->RunUntilIdle(); | 509 test_task_runner_->RunUntilIdle(); |
| 507 EXPECT_TRUE(run_order.empty()); | 510 EXPECT_TRUE(run_order.empty()); |
| 508 | 511 |
| 509 // Once the delay has expired, pumping causes the task to run. | 512 // Once the delay has expired, pumping causes the task to run. |
| 510 runners_[0]->PumpQueue(true); | 513 LazyNow lazy_now(now_src_.get()); |
| 514 runners_[0]->PumpQueue(&lazy_now, true); |
| 511 test_task_runner_->RunUntilIdle(); | 515 test_task_runner_->RunUntilIdle(); |
| 512 EXPECT_THAT(run_order, ElementsAre(1, 2)); | 516 EXPECT_THAT(run_order, ElementsAre(1, 2)); |
| 513 } | 517 } |
| 514 | 518 |
| 515 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { | 519 TEST_F(TaskQueueManagerTest, DelayedTasksDontAutoRunWithManualPumping) { |
| 516 Initialize(1u); | 520 Initialize(1u); |
| 517 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 521 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 518 | 522 |
| 519 std::vector<EnqueueOrder> run_order; | 523 std::vector<EnqueueOrder> run_order; |
| 520 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); | 524 base::TimeDelta delay(base::TimeDelta::FromMilliseconds(10)); |
| 521 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), | 525 runners_[0]->PostDelayedTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order), |
| 522 delay); | 526 delay); |
| 523 | 527 |
| 524 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); | 528 test_task_runner_->RunForPeriod(base::TimeDelta::FromMilliseconds(10)); |
| 525 EXPECT_TRUE(run_order.empty()); | 529 EXPECT_TRUE(run_order.empty()); |
| 526 } | 530 } |
| 527 | 531 |
| 528 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { | 532 TEST_F(TaskQueueManagerTest, ManualPumpingWithNonEmptyWorkQueue) { |
| 529 Initialize(1u); | 533 Initialize(1u); |
| 530 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); | 534 runners_[0]->SetPumpPolicy(TaskQueue::PumpPolicy::MANUAL); |
| 531 | 535 |
| 532 std::vector<EnqueueOrder> run_order; | 536 std::vector<EnqueueOrder> run_order; |
| 533 // Posting two tasks and pumping twice should result in two tasks in the work | 537 // Posting two tasks and pumping twice should result in two tasks in the work |
| 534 // queue. | 538 // queue. |
| 539 LazyNow lazy_now(now_src_.get()); |
| 535 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 540 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 536 runners_[0]->PumpQueue(true); | 541 runners_[0]->PumpQueue(&lazy_now, true); |
| 537 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 542 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 538 runners_[0]->PumpQueue(true); | 543 runners_[0]->PumpQueue(&lazy_now, true); |
| 539 | 544 |
| 540 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); | 545 EXPECT_EQ(2u, runners_[0]->immediate_work_queue()->Size()); |
| 541 } | 546 } |
| 542 | 547 |
| 543 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, | 548 void ReentrantTestTask(scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 544 int countdown, | 549 int countdown, |
| 545 std::vector<EnqueueOrder>* out_result) { | 550 std::vector<EnqueueOrder>* out_result) { |
| 546 out_result->push_back(countdown); | 551 out_result->push_back(countdown); |
| 547 if (--countdown) { | 552 if (--countdown) { |
| 548 runner->PostTask(FROM_HERE, | 553 runner->PostTask(FROM_HERE, |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 695 std::vector<EnqueueOrder> run_order; | 700 std::vector<EnqueueOrder> run_order; |
| 696 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); | 701 runners_[0]->PostTask(FROM_HERE, base::Bind(&TestTask, 1, &run_order)); |
| 697 test_task_runner_->RunUntilIdle(); | 702 test_task_runner_->RunUntilIdle(); |
| 698 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. | 703 EXPECT_TRUE(run_order.empty()); // Shouldn't run - no other task to wake TQM. |
| 699 | 704 |
| 700 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); | 705 runners_[1]->PostTask(FROM_HERE, base::Bind(&TestTask, 2, &run_order)); |
| 701 test_task_runner_->RunUntilIdle(); | 706 test_task_runner_->RunUntilIdle(); |
| 702 // This still shouldn't wake TQM as manual queue was not pumped. | 707 // This still shouldn't wake TQM as manual queue was not pumped. |
| 703 EXPECT_TRUE(run_order.empty()); | 708 EXPECT_TRUE(run_order.empty()); |
| 704 | 709 |
| 705 runners_[1]->PumpQueue(true); | 710 LazyNow lazy_now(now_src_.get()); |
| 711 runners_[1]->PumpQueue(&lazy_now, true); |
| 706 test_task_runner_->RunUntilIdle(); | 712 test_task_runner_->RunUntilIdle(); |
| 707 // Executing a task on an auto pumped queue should wake the TQM. | 713 // Executing a task on an auto pumped queue should wake the TQM. |
| 708 EXPECT_THAT(run_order, ElementsAre(2, 1)); | 714 EXPECT_THAT(run_order, ElementsAre(2, 1)); |
| 709 } | 715 } |
| 710 | 716 |
| 711 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 717 void TestPostingTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 712 base::Closure task) { | 718 base::Closure task) { |
| 713 task_runner->PostTask(FROM_HERE, task); | 719 task_runner->PostTask(FROM_HERE, task); |
| 714 } | 720 } |
| 715 | 721 |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 | 1034 |
| 1029 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); | 1035 queue0->PostTask(FROM_HERE, base::Bind(NullTask)); |
| 1030 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); | 1036 queue1->PostTask(FROM_HERE, base::Bind(NullTask)); |
| 1031 EXPECT_TRUE(queue0->HasPendingImmediateWork()); | 1037 EXPECT_TRUE(queue0->HasPendingImmediateWork()); |
| 1032 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1038 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1033 | 1039 |
| 1034 test_task_runner_->RunUntilIdle(); | 1040 test_task_runner_->RunUntilIdle(); |
| 1035 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1041 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1036 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1042 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1037 | 1043 |
| 1038 queue1->PumpQueue(true); | 1044 LazyNow lazy_now(now_src_.get()); |
| 1045 queue1->PumpQueue(&lazy_now, true); |
| 1039 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1046 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1040 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1047 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1041 | 1048 |
| 1042 test_task_runner_->RunUntilIdle(); | 1049 test_task_runner_->RunUntilIdle(); |
| 1043 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1050 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1044 EXPECT_FALSE(queue1->HasPendingImmediateWork()); | 1051 EXPECT_FALSE(queue1->HasPendingImmediateWork()); |
| 1045 } | 1052 } |
| 1046 | 1053 |
| 1047 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { | 1054 TEST_F(TaskQueueManagerTest, HasPendingImmediateWorkAndNeedsPumping) { |
| 1048 Initialize(2u); | 1055 Initialize(2u); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1071 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1078 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1072 EXPECT_TRUE(queue1->NeedsPumping()); | 1079 EXPECT_TRUE(queue1->NeedsPumping()); |
| 1073 | 1080 |
| 1074 test_task_runner_->ClearRunTaskLimit(); | 1081 test_task_runner_->ClearRunTaskLimit(); |
| 1075 test_task_runner_->RunUntilIdle(); | 1082 test_task_runner_->RunUntilIdle(); |
| 1076 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1083 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1077 EXPECT_FALSE(queue0->NeedsPumping()); | 1084 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1078 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1085 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1079 EXPECT_TRUE(queue1->NeedsPumping()); | 1086 EXPECT_TRUE(queue1->NeedsPumping()); |
| 1080 | 1087 |
| 1081 queue1->PumpQueue(true); | 1088 LazyNow lazy_now(now_src_.get()); |
| 1089 queue1->PumpQueue(&lazy_now, true); |
| 1082 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1090 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1083 EXPECT_FALSE(queue0->NeedsPumping()); | 1091 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1084 EXPECT_TRUE(queue1->HasPendingImmediateWork()); | 1092 EXPECT_TRUE(queue1->HasPendingImmediateWork()); |
| 1085 EXPECT_FALSE(queue1->NeedsPumping()); | 1093 EXPECT_FALSE(queue1->NeedsPumping()); |
| 1086 | 1094 |
| 1087 test_task_runner_->RunUntilIdle(); | 1095 test_task_runner_->RunUntilIdle(); |
| 1088 EXPECT_FALSE(queue0->HasPendingImmediateWork()); | 1096 EXPECT_FALSE(queue0->HasPendingImmediateWork()); |
| 1089 EXPECT_FALSE(queue0->NeedsPumping()); | 1097 EXPECT_FALSE(queue0->NeedsPumping()); |
| 1090 EXPECT_FALSE(queue1->HasPendingImmediateWork()); | 1098 EXPECT_FALSE(queue1->HasPendingImmediateWork()); |
| 1091 EXPECT_FALSE(queue1->NeedsPumping()); | 1099 EXPECT_FALSE(queue1->NeedsPumping()); |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 | 1920 |
| 1913 trace_analyzer::TraceEventVector events; | 1921 trace_analyzer::TraceEventVector events; |
| 1914 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || | 1922 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || |
| 1915 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); | 1923 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); |
| 1916 analyzer->FindEvents(q, &events); | 1924 analyzer->FindEvents(q, &events); |
| 1917 | 1925 |
| 1918 EXPECT_EQ(2u, events.size()); | 1926 EXPECT_EQ(2u, events.size()); |
| 1919 } | 1927 } |
| 1920 | 1928 |
| 1921 } // namespace scheduler | 1929 } // namespace scheduler |
| OLD | NEW |