| 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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 control_task_runner_( | 24 control_task_runner_( |
| 25 task_queue_manager_->TaskRunnerForQueue(CONTROL_TASK_QUEUE)), | 25 task_queue_manager_->TaskRunnerForQueue(CONTROL_TASK_QUEUE)), |
| 26 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( | 26 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( |
| 27 CONTROL_TASK_AFTER_WAKEUP_QUEUE)), | 27 CONTROL_TASK_AFTER_WAKEUP_QUEUE)), |
| 28 default_task_runner_( | 28 default_task_runner_( |
| 29 task_queue_manager_->TaskRunnerForQueue(DEFAULT_TASK_QUEUE)), | 29 task_queue_manager_->TaskRunnerForQueue(DEFAULT_TASK_QUEUE)), |
| 30 compositor_task_runner_( | 30 compositor_task_runner_( |
| 31 task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), | 31 task_queue_manager_->TaskRunnerForQueue(COMPOSITOR_TASK_QUEUE)), |
| 32 loading_task_runner_( | 32 loading_task_runner_( |
| 33 task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), | 33 task_queue_manager_->TaskRunnerForQueue(LOADING_TASK_QUEUE)), |
| 34 timer_task_runner_( |
| 35 task_queue_manager_->TaskRunnerForQueue(TIMER_TASK_QUEUE)), |
| 34 current_policy_(Policy::NORMAL), | 36 current_policy_(Policy::NORMAL), |
| 35 last_input_type_(blink::WebInputEvent::Undefined), | 37 last_input_type_(blink::WebInputEvent::Undefined), |
| 36 input_stream_state_(InputStreamState::INACTIVE), | 38 input_stream_state_(InputStreamState::INACTIVE), |
| 37 policy_may_need_update_(&incoming_signals_lock_), | 39 policy_may_need_update_(&incoming_signals_lock_), |
| 40 timer_queue_suspended_(0), |
| 38 weak_factory_(this) { | 41 weak_factory_(this) { |
| 39 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); | 42 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); |
| 40 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 43 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 41 weak_renderer_scheduler_ptr_); | 44 weak_renderer_scheduler_ptr_); |
| 42 end_idle_period_closure_.Reset(base::Bind( | 45 end_idle_period_closure_.Reset(base::Bind( |
| 43 &RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); | 46 &RendererSchedulerImpl::EndIdlePeriod, weak_renderer_scheduler_ptr_)); |
| 44 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( | 47 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( |
| 45 task_queue_manager_->TaskRunnerForQueue(IDLE_TASK_QUEUE), | 48 task_queue_manager_->TaskRunnerForQueue(IDLE_TASK_QUEUE), |
| 46 control_task_after_wakeup_runner_, | 49 control_task_after_wakeup_runner_, |
| 47 base::Bind(&RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback, | 50 base::Bind(&RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 DCHECK(main_thread_checker_.CalledOnValidThread()); | 104 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 102 return idle_task_runner_; | 105 return idle_task_runner_; |
| 103 } | 106 } |
| 104 | 107 |
| 105 scoped_refptr<base::SingleThreadTaskRunner> | 108 scoped_refptr<base::SingleThreadTaskRunner> |
| 106 RendererSchedulerImpl::LoadingTaskRunner() { | 109 RendererSchedulerImpl::LoadingTaskRunner() { |
| 107 DCHECK(main_thread_checker_.CalledOnValidThread()); | 110 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 108 return loading_task_runner_; | 111 return loading_task_runner_; |
| 109 } | 112 } |
| 110 | 113 |
| 114 scoped_refptr<base::SingleThreadTaskRunner> |
| 115 RendererSchedulerImpl::TimerTaskRunner() { |
| 116 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 117 return timer_task_runner_; |
| 118 } |
| 119 |
| 111 void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) { | 120 void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) { |
| 112 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 121 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 113 "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue()); | 122 "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue()); |
| 114 DCHECK(main_thread_checker_.CalledOnValidThread()); | 123 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 115 if (!task_queue_manager_) | 124 if (!task_queue_manager_) |
| 116 return; | 125 return; |
| 117 | 126 |
| 118 EndIdlePeriod(); | 127 EndIdlePeriod(); |
| 119 estimated_next_frame_begin_ = args.frame_time + args.interval; | 128 estimated_next_frame_begin_ = args.frame_time + args.interval; |
| 120 // TODO(skyostil): Wire up real notification of input events processing | 129 // TODO(skyostil): Wire up real notification of input events processing |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 return; | 301 return; |
| 293 | 302 |
| 294 switch (new_policy) { | 303 switch (new_policy) { |
| 295 case Policy::COMPOSITOR_PRIORITY: | 304 case Policy::COMPOSITOR_PRIORITY: |
| 296 renderer_task_queue_selector_->SetQueuePriority( | 305 renderer_task_queue_selector_->SetQueuePriority( |
| 297 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); | 306 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); |
| 298 // TODO(scheduler-dev): Add a task priority between HIGH and BEST_EFFORT | 307 // TODO(scheduler-dev): Add a task priority between HIGH and BEST_EFFORT |
| 299 // that still has some guarantee of running. | 308 // that still has some guarantee of running. |
| 300 renderer_task_queue_selector_->SetQueuePriority( | 309 renderer_task_queue_selector_->SetQueuePriority( |
| 301 LOADING_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); | 310 LOADING_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); |
| 311 MaybeEnableTimerQueue(); |
| 302 break; | 312 break; |
| 303 case Policy::TOUCHSTART_PRIORITY: | 313 case Policy::TOUCHSTART_PRIORITY: |
| 304 renderer_task_queue_selector_->SetQueuePriority( | 314 renderer_task_queue_selector_->SetQueuePriority( |
| 305 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); | 315 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::HIGH_PRIORITY); |
| 306 renderer_task_queue_selector_->DisableQueue(LOADING_TASK_QUEUE); | 316 renderer_task_queue_selector_->DisableQueue(LOADING_TASK_QUEUE); |
| 317 renderer_task_queue_selector_->DisableQueue(TIMER_TASK_QUEUE); |
| 307 break; | 318 break; |
| 308 case Policy::NORMAL: | 319 case Policy::NORMAL: |
| 309 renderer_task_queue_selector_->SetQueuePriority( | 320 renderer_task_queue_selector_->SetQueuePriority( |
| 310 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); | 321 COMPOSITOR_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); |
| 311 renderer_task_queue_selector_->SetQueuePriority( | 322 renderer_task_queue_selector_->SetQueuePriority( |
| 312 LOADING_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); | 323 LOADING_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); |
| 324 MaybeEnableTimerQueue(); |
| 313 break; | 325 break; |
| 314 } | 326 } |
| 315 DCHECK(renderer_task_queue_selector_->IsQueueEnabled(COMPOSITOR_TASK_QUEUE)); | 327 DCHECK(renderer_task_queue_selector_->IsQueueEnabled(COMPOSITOR_TASK_QUEUE)); |
| 316 if (new_policy != Policy::TOUCHSTART_PRIORITY) | 328 if (new_policy != Policy::TOUCHSTART_PRIORITY) |
| 317 DCHECK(renderer_task_queue_selector_->IsQueueEnabled(LOADING_TASK_QUEUE)); | 329 DCHECK(renderer_task_queue_selector_->IsQueueEnabled(LOADING_TASK_QUEUE)); |
| 318 | 330 |
| 319 current_policy_ = new_policy; | 331 current_policy_ = new_policy; |
| 320 | 332 |
| 321 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 333 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
| 322 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 334 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 task_queue_manager_->AddTaskObserver(task_observer); | 566 task_queue_manager_->AddTaskObserver(task_observer); |
| 555 } | 567 } |
| 556 | 568 |
| 557 void RendererSchedulerImpl::RemoveTaskObserver( | 569 void RendererSchedulerImpl::RemoveTaskObserver( |
| 558 base::MessageLoop::TaskObserver* task_observer) { | 570 base::MessageLoop::TaskObserver* task_observer) { |
| 559 DCHECK(main_thread_checker_.CalledOnValidThread()); | 571 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 560 if (task_queue_manager_) | 572 if (task_queue_manager_) |
| 561 task_queue_manager_->RemoveTaskObserver(task_observer); | 573 task_queue_manager_->RemoveTaskObserver(task_observer); |
| 562 } | 574 } |
| 563 | 575 |
| 576 void RendererSchedulerImpl::SuspendTimerQueue() { |
| 577 timer_queue_suspended_++; |
| 578 renderer_task_queue_selector_->DisableQueue(TIMER_TASK_QUEUE); |
| 579 } |
| 580 |
| 581 void RendererSchedulerImpl::ResumeTimerQueue() { |
| 582 timer_queue_suspended_--; |
| 583 |
| 584 MaybeUpdatePolicy(); |
| 585 if (SchedulerPolicy() != Policy::TOUCHSTART_PRIORITY) |
| 586 MaybeEnableTimerQueue(); |
| 587 } |
| 588 |
| 589 void RendererSchedulerImpl::MaybeEnableTimerQueue() { |
| 590 if (timer_queue_suspended_ == 0) |
| 591 renderer_task_queue_selector_->SetQueuePriority( |
| 592 TIMER_TASK_QUEUE, RendererTaskQueueSelector::NORMAL_PRIORITY); |
| 593 } |
| 594 |
| 564 } // namespace content | 595 } // namespace content |
| OLD | NEW |