Chromium Code Reviews| 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/renderer/renderer_scheduler_impl.h" | 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/stack_trace.h" | 8 #include "base/debug/stack_trace.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 21 matching lines...) Expand all Loading... | |
| 32 idle_helper_(&helper_, | 32 idle_helper_(&helper_, |
| 33 this, | 33 this, |
| 34 "renderer.scheduler", | 34 "renderer.scheduler", |
| 35 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 35 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 36 "RendererSchedulerIdlePeriod", | 36 "RendererSchedulerIdlePeriod", |
| 37 base::TimeDelta()), | 37 base::TimeDelta()), |
| 38 control_task_runner_(helper_.ControlTaskRunner()), | 38 control_task_runner_(helper_.ControlTaskRunner()), |
| 39 compositor_task_runner_( | 39 compositor_task_runner_( |
| 40 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 40 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
| 41 .SetShouldMonitorQuiescence(true))), | 41 .SetShouldMonitorQuiescence(true))), |
| 42 loading_task_runner_( | |
| 43 helper_.NewTaskQueue(TaskQueue::Spec("loading_tq") | |
| 44 .SetShouldMonitorQuiescence(true))), | |
| 45 timer_task_runner_( | |
| 46 helper_.NewTaskQueue(TaskQueue::Spec("timer_tq") | |
| 47 .SetShouldMonitorQuiescence(true))), | |
| 48 delayed_update_policy_runner_( | 42 delayed_update_policy_runner_( |
| 49 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 43 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 50 base::Unretained(this)), | 44 base::Unretained(this)), |
| 51 helper_.ControlTaskRunner()), | 45 helper_.ControlTaskRunner()), |
| 52 policy_may_need_update_(&any_thread_lock_), | 46 policy_may_need_update_(&any_thread_lock_), |
| 53 weak_factory_(this) { | 47 weak_factory_(this) { |
| 54 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 48 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 55 weak_factory_.GetWeakPtr()); | 49 weak_factory_.GetWeakPtr()); |
| 56 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 50 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
| 57 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 51 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
| 58 | 52 |
| 59 suspend_timers_when_backgrounded_closure_.Reset( | 53 suspend_timers_when_backgrounded_closure_.Reset( |
| 60 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 54 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
| 61 weak_factory_.GetWeakPtr())); | 55 weak_factory_.GetWeakPtr())); |
| 62 | 56 |
| 63 loading_task_runner_->AddTaskObserver( | 57 default_loading_task_runner_ = NewLoadingTaskRunner("loading_tq"); |
| 64 &MainThreadOnly().loading_task_cost_estimator); | 58 default_timer_task_runner_ = NewTimerTaskRunner("timer_tq"); |
| 65 | |
| 66 timer_task_runner_->AddTaskObserver( | |
| 67 &MainThreadOnly().timer_task_cost_estimator); | |
| 68 | 59 |
| 69 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 60 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
| 70 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 61 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| 71 this); | 62 this); |
| 72 | 63 |
| 73 // Make sure that we don't initially assume there is no idle time. | 64 // Make sure that we don't initially assume there is no idle time. |
| 74 MainThreadOnly().short_idle_period_duration.InsertSample( | 65 MainThreadOnly().short_idle_period_duration.InsertSample( |
| 75 cc::BeginFrameArgs::DefaultInterval()); | 66 cc::BeginFrameArgs::DefaultInterval()); |
| 76 } | 67 } |
| 77 | 68 |
| 78 RendererSchedulerImpl::~RendererSchedulerImpl() { | 69 RendererSchedulerImpl::~RendererSchedulerImpl() { |
| 79 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 70 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
| 80 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 71 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| 81 this); | 72 this); |
| 82 timer_task_runner_->RemoveTaskObserver( | 73 |
| 83 &MainThreadOnly().timer_task_cost_estimator); | 74 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
| 84 loading_task_runner_->RemoveTaskObserver( | 75 loading_queue->RemoveTaskObserver( |
| 85 &MainThreadOnly().loading_task_cost_estimator); | 76 &MainThreadOnly().loading_task_cost_estimator); |
| 77 } | |
| 78 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | |
| 79 timer_queue->RemoveTaskObserver( | |
| 80 &MainThreadOnly().timer_task_cost_estimator); | |
| 81 } | |
| 82 | |
| 86 // Ensure the renderer scheduler was shut down explicitly, because otherwise | 83 // Ensure the renderer scheduler was shut down explicitly, because otherwise |
| 87 // we could end up having stale pointers to the Blink heap which has been | 84 // we could end up having stale pointers to the Blink heap which has been |
| 88 // terminated by this point. | 85 // terminated by this point. |
| 89 DCHECK(MainThreadOnly().was_shutdown); | 86 DCHECK(MainThreadOnly().was_shutdown); |
| 90 } | 87 } |
| 91 | 88 |
| 92 RendererSchedulerImpl::Policy::Policy() | 89 RendererSchedulerImpl::Policy::Policy() |
| 93 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), | 90 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| 94 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), | 91 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| 95 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), | 92 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 142 } | 139 } |
| 143 | 140 |
| 144 scoped_refptr<SingleThreadIdleTaskRunner> | 141 scoped_refptr<SingleThreadIdleTaskRunner> |
| 145 RendererSchedulerImpl::IdleTaskRunner() { | 142 RendererSchedulerImpl::IdleTaskRunner() { |
| 146 return idle_helper_.IdleTaskRunner(); | 143 return idle_helper_.IdleTaskRunner(); |
| 147 } | 144 } |
| 148 | 145 |
| 149 scoped_refptr<base::SingleThreadTaskRunner> | 146 scoped_refptr<base::SingleThreadTaskRunner> |
| 150 RendererSchedulerImpl::LoadingTaskRunner() { | 147 RendererSchedulerImpl::LoadingTaskRunner() { |
| 151 helper_.CheckOnValidThread(); | 148 helper_.CheckOnValidThread(); |
| 152 return loading_task_runner_; | 149 return default_loading_task_runner_; |
| 153 } | 150 } |
| 154 | 151 |
| 155 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { | 152 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { |
| 156 helper_.CheckOnValidThread(); | 153 helper_.CheckOnValidThread(); |
| 157 return timer_task_runner_; | 154 return default_timer_task_runner_; |
| 155 } | |
| 156 | |
| 157 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( | |
| 158 const char* name) { | |
| 159 helper_.CheckOnValidThread(); | |
| 160 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( | |
| 161 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); | |
| 162 loading_task_runners_.insert(loading_task_queue); | |
| 163 loading_task_queue->SetQueuePriority( | |
| 164 MainThreadOnly().current_policy.loading_queue_priority); | |
| 165 loading_task_queue->AddTaskObserver( | |
| 166 &MainThreadOnly().loading_task_cost_estimator); | |
| 167 return loading_task_queue; | |
| 168 } | |
| 169 | |
| 170 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( | |
| 171 const char* name) { | |
| 172 helper_.CheckOnValidThread(); | |
| 173 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( | |
| 174 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); | |
| 175 timer_task_runners_.insert(timer_task_queue); | |
| 176 timer_task_queue->SetQueuePriority( | |
| 177 MainThreadOnly().current_policy.timer_queue_priority); | |
| 178 timer_task_queue->AddTaskObserver( | |
| 179 &MainThreadOnly().timer_task_cost_estimator); | |
| 180 return timer_task_queue; | |
| 181 } | |
| 182 | |
| 183 void RendererSchedulerImpl::UnregisterTaskRunner( | |
| 184 scoped_refptr<TaskQueue>& task_queue) { | |
| 185 loading_task_runners_.erase(task_queue); | |
| 186 timer_task_runners_.erase(task_queue); | |
| 187 helper_.UnregisterTaskQueue(task_queue); | |
|
Sami
2015/09/10 12:51:58
Should we be removing the observers here too?
| |
| 158 } | 188 } |
| 159 | 189 |
| 160 bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { | 190 bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { |
| 161 return idle_helper_.CanExceedIdleDeadlineIfRequired(); | 191 return idle_helper_.CanExceedIdleDeadlineIfRequired(); |
| 162 } | 192 } |
| 163 | 193 |
| 164 void RendererSchedulerImpl::AddTaskObserver( | 194 void RendererSchedulerImpl::AddTaskObserver( |
| 165 base::MessageLoop::TaskObserver* task_observer) { | 195 base::MessageLoop::TaskObserver* task_observer) { |
| 166 helper_.AddTaskObserver(task_observer); | 196 helper_.AddTaskObserver(task_observer); |
| 167 } | 197 } |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 "RendererScheduler.timer_tasks_seem_expensive", | 646 "RendererScheduler.timer_tasks_seem_expensive", |
| 617 MainThreadOnly().timer_tasks_seem_expensive); | 647 MainThreadOnly().timer_tasks_seem_expensive); |
| 618 | 648 |
| 619 if (update_type == UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED && | 649 if (update_type == UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED && |
| 620 new_policy == MainThreadOnly().current_policy) { | 650 new_policy == MainThreadOnly().current_policy) { |
| 621 return; | 651 return; |
| 622 } | 652 } |
| 623 | 653 |
| 624 compositor_task_runner_->SetQueuePriority( | 654 compositor_task_runner_->SetQueuePriority( |
| 625 new_policy.compositor_queue_priority); | 655 new_policy.compositor_queue_priority); |
| 626 loading_task_runner_->SetQueuePriority(new_policy.loading_queue_priority); | 656 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
| 627 timer_task_runner_->SetQueuePriority(new_policy.timer_queue_priority); | 657 loading_queue->SetQueuePriority(new_policy.loading_queue_priority); |
| 658 } | |
| 659 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | |
| 660 timer_queue->SetQueuePriority(new_policy.timer_queue_priority); | |
| 661 } | |
| 628 | 662 |
| 629 // TODO(alexclarke): We shouldn't have to prioritize the default queue, but it | 663 // TODO(alexclarke): We shouldn't have to prioritize the default queue, but it |
| 630 // appears to be necessary since the order of loading tasks and IPCs (which | 664 // appears to be necessary since the order of loading tasks and IPCs (which |
| 631 // are mostly dispatched on the default queue) need to be preserved. | 665 // are mostly dispatched on the default queue) need to be preserved. |
| 632 helper_.DefaultTaskRunner()->SetQueuePriority( | 666 helper_.DefaultTaskRunner()->SetQueuePriority( |
| 633 new_policy.default_queue_priority); | 667 new_policy.default_queue_priority); |
| 634 | 668 |
| 635 DCHECK(compositor_task_runner_->IsQueueEnabled()); | 669 DCHECK(compositor_task_runner_->IsQueueEnabled()); |
| 636 MainThreadOnly().current_policy = new_policy; | 670 MainThreadOnly().current_policy = new_policy; |
| 637 } | 671 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 698 return true; | 732 return true; |
| 699 } | 733 } |
| 700 | 734 |
| 701 SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { | 735 SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { |
| 702 return &helper_; | 736 return &helper_; |
| 703 } | 737 } |
| 704 | 738 |
| 705 void RendererSchedulerImpl::SuspendTimerQueue() { | 739 void RendererSchedulerImpl::SuspendTimerQueue() { |
| 706 MainThreadOnly().timer_queue_suspend_count++; | 740 MainThreadOnly().timer_queue_suspend_count++; |
| 707 ForceUpdatePolicy(); | 741 ForceUpdatePolicy(); |
| 708 DCHECK(!timer_task_runner_->IsQueueEnabled()); | 742 DCHECK(!default_timer_task_runner_->IsQueueEnabled()); |
| 709 } | 743 } |
| 710 | 744 |
| 711 void RendererSchedulerImpl::ResumeTimerQueue() { | 745 void RendererSchedulerImpl::ResumeTimerQueue() { |
| 712 MainThreadOnly().timer_queue_suspend_count--; | 746 MainThreadOnly().timer_queue_suspend_count--; |
| 713 DCHECK_GE(MainThreadOnly().timer_queue_suspend_count, 0); | 747 DCHECK_GE(MainThreadOnly().timer_queue_suspend_count, 0); |
| 714 ForceUpdatePolicy(); | 748 ForceUpdatePolicy(); |
| 715 } | 749 } |
| 716 | 750 |
| 717 void RendererSchedulerImpl::SetTimerQueueSuspensionWhenBackgroundedEnabled( | 751 void RendererSchedulerImpl::SetTimerQueueSuspensionWhenBackgroundedEnabled( |
| 718 bool enabled) { | 752 bool enabled) { |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 843 MainThreadOnly().short_idle_period_duration.Clear(); | 877 MainThreadOnly().short_idle_period_duration.Clear(); |
| 844 // Make sure that we don't initially assume there is no idle time. | 878 // Make sure that we don't initially assume there is no idle time. |
| 845 MainThreadOnly().short_idle_period_duration.InsertSample( | 879 MainThreadOnly().short_idle_period_duration.InsertSample( |
| 846 cc::BeginFrameArgs::DefaultInterval()); | 880 cc::BeginFrameArgs::DefaultInterval()); |
| 847 AnyThread().user_model.Reset(); | 881 AnyThread().user_model.Reset(); |
| 848 MainThreadOnly().have_seen_a_begin_main_frame = false; | 882 MainThreadOnly().have_seen_a_begin_main_frame = false; |
| 849 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 883 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 850 } | 884 } |
| 851 | 885 |
| 852 } // namespace scheduler | 886 } // namespace scheduler |
| OLD | NEW |