Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1314903007: Implement WebFrameScheduler and WebPageScheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Record origin in TQM trace event Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698