| Index: content/renderer/scheduler/renderer_scheduler_impl.cc
|
| diff --git a/content/renderer/scheduler/renderer_scheduler_impl.cc b/content/renderer/scheduler/renderer_scheduler_impl.cc
|
| index 6f7821690393a3b8c61b9956f28deb523e766a6b..fafbd8dba7d185e29ef1157b0f31de74ebcb578e 100644
|
| --- a/content/renderer/scheduler/renderer_scheduler_impl.cc
|
| +++ b/content/renderer/scheduler/renderer_scheduler_impl.cc
|
| @@ -31,10 +31,13 @@ RendererSchedulerImpl::RendererSchedulerImpl(
|
| task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)),
|
| loading_task_runner_(
|
| task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)),
|
| + timer_task_runner_(
|
| + task_queue_manager_->TaskRunnerForQueue(TIMER_TASK_QUEUE)),
|
| current_policy_(Policy::NORMAL),
|
| last_input_type_(blink::WebInputEvent::Undefined),
|
| input_stream_state_(InputStreamState::INACTIVE),
|
| policy_may_need_update_(&incoming_signals_lock_),
|
| + timer_queue_suspended_(0),
|
| weak_factory_(this) {
|
| weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr();
|
| update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
|
| @@ -108,6 +111,12 @@ RendererSchedulerImpl::LoadingTaskRunner() {
|
| return loading_task_runner_;
|
| }
|
|
|
| +scoped_refptr<base::SingleThreadTaskRunner>
|
| +RendererSchedulerImpl::TimerTaskRunner() {
|
| + DCHECK(main_thread_checker_.CalledOnValidThread());
|
| + return timer_task_runner_;
|
| +}
|
| +
|
| void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) {
|
| TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue());
|
| @@ -299,17 +308,20 @@ void RendererSchedulerImpl::UpdatePolicy() {
|
| // that still has some guarantee of running.
|
| renderer_task_queue_selector_->SetQueuePriority(
|
| LOADING_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY);
|
| + MaybeEnableTimerQueue();
|
| break;
|
| case Policy::TOUCHSTART_PRIORITY:
|
| renderer_task_queue_selector_->SetQueuePriority(
|
| COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY);
|
| renderer_task_queue_selector_->DisableQueue(LOADING_TASK_QUEUE);
|
| + renderer_task_queue_selector_->DisableQueue(TIMER_TASK_QUEUE);
|
| break;
|
| case Policy::NORMAL:
|
| renderer_task_queue_selector_->SetQueuePriority(
|
| COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY);
|
| renderer_task_queue_selector_->SetQueuePriority(
|
| LOADING_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY);
|
| + MaybeEnableTimerQueue();
|
| break;
|
| }
|
| DCHECK(renderer_task_queue_selector_->IsQueueEnabled(COMPOSITOR_TASK_QUEUE));
|
| @@ -561,4 +573,23 @@ void RendererSchedulerImpl::RemoveTaskObserver(
|
| task_queue_manager_->RemoveTaskObserver(task_observer);
|
| }
|
|
|
| +void RendererSchedulerImpl::SuspendTimerQueue() {
|
| + timer_queue_suspended_++;
|
| + renderer_task_queue_selector_->DisableQueue(TIMER_TASK_QUEUE);
|
| +}
|
| +
|
| +void RendererSchedulerImpl::ResumeTimerQueue() {
|
| + timer_queue_suspended_--;
|
| +
|
| + MaybeUpdatePolicy();
|
| + if (SchedulerPolicy() != Policy::TOUCHSTART_PRIORITY)
|
| + MaybeEnableTimerQueue();
|
| +}
|
| +
|
| +void RendererSchedulerImpl::MaybeEnableTimerQueue() {
|
| + if (timer_queue_suspended_ == 0)
|
| + renderer_task_queue_selector_->SetQueuePriority(
|
| + TIMER_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY);
|
| +}
|
| +
|
| } // namespace content
|
|
|