 Chromium Code Reviews
 Chromium Code Reviews Issue 2778123003:
  [scheduler] Add WakeupBudgetPool.  (Closed)
    
  
    Issue 2778123003:
  [scheduler] Add WakeupBudgetPool.  (Closed) 
  | Index: third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc | 
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc | 
| index 1814fbc11b6df73dcc1a8097b6e4b9ba3ec370a8..d0a67843e506fda4d30e15ff8f744993a7ef3e27 100644 | 
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc | 
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler_unittest.cc | 
| @@ -201,7 +201,7 @@ TEST_F(TaskQueueThrottlerTest, TimerAlignment) { | 
| mock_task_runner_->RunUntilIdle(); | 
| - // Times are aligned to a multipple of 1000 milliseconds. | 
| + // Times are aligned to a multiple of 1000 milliseconds. | 
| EXPECT_THAT( | 
| run_times, | 
| ElementsAre( | 
| @@ -1055,5 +1055,131 @@ TEST_F(TaskQueueThrottlerTest, TwoBudgetPools) { | 
| base::TimeTicks() + base::TimeDelta::FromMilliseconds(26000))); | 
| } | 
| +namespace { | 
| +void RunChainedTask(size_t run_times_count, | 
| + scoped_refptr<TaskQueue> queue, | 
| + base::SimpleTestTickClock* clock, | 
| + base::TimeDelta task_duration, | 
| + std::vector<base::TimeTicks>* run_times) { | 
| + run_times->push_back(clock->NowTicks()); | 
| + clock->Advance(task_duration); | 
| + | 
| + if (run_times_count <= 1) | 
| + return; | 
| + | 
| + queue->PostTask(FROM_HERE, | 
| + base::Bind(&RunChainedTask, run_times_count - 1, queue, clock, | 
| + task_duration, run_times)); | 
| +} | 
| + | 
| +void RunChainedDelayedTask(size_t run_times_count, | 
| + scoped_refptr<TaskQueue> queue, | 
| + base::SimpleTestTickClock* clock, | 
| + base::TimeDelta task_duration, | 
| + std::vector<base::TimeTicks>* run_times, | 
| + base::TimeDelta delay) { | 
| + run_times->push_back(clock->NowTicks()); | 
| + clock->Advance(task_duration); | 
| + | 
| + if (run_times_count <= 1) | 
| + return; | 
| + | 
| + queue->PostDelayedTask( | 
| + FROM_HERE, | 
| + base::Bind(&RunChainedDelayedTask, run_times_count - 1, queue, clock, | 
| + task_duration, run_times, delay), | 
| + delay); | 
| +} | 
| +} // namespace | 
| + | 
| +TEST_F(TaskQueueThrottlerTest, | 
| + WakeUpBasedThrottling_ChainedTasks_Instantaneous) { | 
| + scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | 
| + base::TimeDelta::FromMilliseconds(10)); | 
| + std::vector<base::TimeTicks> run_times; | 
| + | 
| + task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | 
| + | 
| + timer_queue_->PostDelayedTask( | 
| + FROM_HERE, | 
| + base::Bind(&RunChainedTask, 10, timer_queue_, clock_.get(), | 
| 
Sami
2017/04/26 13:09:08
Should we make this 10 larger to check that we onl
 
altimin
2017/04/26 14:31:30
I'm not quite sure what you mean here. There tasks
 
Sami
2017/04/27 12:12:30
Ah yes, you're right.
 | 
| + base::TimeDelta(), &run_times), | 
| + base::TimeDelta::FromMilliseconds(100)); | 
| + | 
| + mock_task_runner_->RunUntilIdle(); | 
| + | 
| + EXPECT_THAT(run_times, | 
| + ElementsAre(base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1), | 
| + base::TimeTicks() + base::TimeDelta::FromSeconds(1))); | 
| +} | 
| + | 
| +TEST_F(TaskQueueThrottlerTest, WakeUpBasedThrottling_ImmediateTasks_Fast) { | 
| + scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | 
| + base::TimeDelta::FromMilliseconds(10)); | 
| + std::vector<base::TimeTicks> run_times; | 
| + | 
| + task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | 
| + | 
| + timer_queue_->PostDelayedTask( | 
| + FROM_HERE, | 
| + base::Bind(&RunChainedTask, 10, timer_queue_, clock_.get(), | 
| + base::TimeDelta::FromMilliseconds(3), &run_times), | 
| + base::TimeDelta::FromMilliseconds(100)); | 
| + | 
| + mock_task_runner_->RunUntilIdle(); | 
| + | 
| + // TODO(altimin): Add fence mechanism to block immediate tasks. | 
| 
Sami
2017/04/26 13:09:08
Just curious, how do interleaved immediate tasks w
 
altimin
2017/04/26 14:31:30
The fence is installed, but it is too late, so one
 | 
| + EXPECT_THAT( | 
| + run_times, | 
| + ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1003), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1006), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1009), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1012), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2003), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2006), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2009), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2012))); | 
| +} | 
| + | 
| +TEST_F(TaskQueueThrottlerTest, WakeUpBasedThrottling_DelayedTasks) { | 
| + scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( | 
| + base::TimeDelta::FromMilliseconds(10)); | 
| + std::vector<base::TimeTicks> run_times; | 
| + | 
| + task_queue_throttler_->IncreaseThrottleRefCount(timer_queue_.get()); | 
| + | 
| + timer_queue_->PostDelayedTask( | 
| + FROM_HERE, | 
| + base::Bind(&RunChainedDelayedTask, 10, timer_queue_, clock_.get(), | 
| + base::TimeDelta(), &run_times, | 
| + base::TimeDelta::FromMilliseconds(3)), | 
| + base::TimeDelta::FromMilliseconds(100)); | 
| + | 
| + mock_task_runner_->RunUntilIdle(); | 
| + | 
| + EXPECT_THAT( | 
| + run_times, | 
| + ElementsAre(base::TimeTicks() + base::TimeDelta::FromMilliseconds(1000), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1003), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1006), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(1009), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2000), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2003), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2006), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(2009), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(3000), | 
| + base::TimeTicks() + base::TimeDelta::FromMilliseconds(3003))); | 
| +} | 
| + | 
| } // namespace scheduler | 
| } // namespace blink |