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 |