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

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

Issue 1441073006: Move throttling of background timers into the renderer scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed various dchecks Created 5 years 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/logging.h" 9 #include "base/logging.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
11 #include "base/trace_event/trace_event_argument.h" 11 #include "base/trace_event/trace_event_argument.h"
12 #include "cc/output/begin_frame_args.h" 12 #include "cc/output/begin_frame_args.h"
13 #include "components/scheduler/base/task_queue_impl.h" 13 #include "components/scheduler/base/task_queue_impl.h"
14 #include "components/scheduler/base/task_queue_selector.h" 14 #include "components/scheduler/base/task_queue_selector.h"
15 #include "components/scheduler/base/virtual_time_domain.h"
15 #include "components/scheduler/child/scheduler_tqm_delegate.h" 16 #include "components/scheduler/child/scheduler_tqm_delegate.h"
16 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" 17 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h"
17 18
18 namespace scheduler { 19 namespace scheduler {
19 namespace { 20 namespace {
20 // The run time of loading tasks is strongly bimodal. The vast majority are 21 // The run time of loading tasks is strongly bimodal. The vast majority are
21 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 22 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1
22 // second on a mobile device) so we take a very pesimistic view when estimating 23 // second on a mobile device) so we take a very pesimistic view when estimating
23 // the cost of loading tasks. 24 // the cost of loading tasks.
24 const int kLoadingTaskEstimationSampleCount = 1000; 25 const int kLoadingTaskEstimationSampleCount = 1000;
25 const double kLoadingTaskEstimationPercentile = 98; 26 const double kLoadingTaskEstimationPercentile = 98;
26 const int kTimerTaskEstimationSampleCount = 200; 27 const int kTimerTaskEstimationSampleCount = 200;
27 const double kTimerTaskEstimationPercentile = 90; 28 const double kTimerTaskEstimationPercentile = 90;
28 const int kShortIdlePeriodDurationSampleCount = 10; 29 const int kShortIdlePeriodDurationSampleCount = 10;
29 const double kShortIdlePeriodDurationPercentile = 50; 30 const double kShortIdlePeriodDurationPercentile = 50;
30 } 31 }
31 32
32 RendererSchedulerImpl::RendererSchedulerImpl( 33 RendererSchedulerImpl::RendererSchedulerImpl(
33 scoped_refptr<SchedulerTqmDelegate> main_task_runner) 34 scoped_refptr<SchedulerTqmDelegate> main_task_runner)
34 : helper_(main_task_runner, 35 : helper_(main_task_runner,
35 "renderer.scheduler", 36 "renderer.scheduler",
36 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), 38 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")),
38 idle_helper_(&helper_, 39 idle_helper_(&helper_,
39 this, 40 this,
40 "renderer.scheduler", 41 "renderer.scheduler",
41 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 42 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
42 "RendererSchedulerIdlePeriod", 43 "RendererSchedulerIdlePeriod",
43 base::TimeDelta()), 44 base::TimeDelta()),
45 throttling_helper_(this, "renderer.scheduler"),
44 render_widget_scheduler_signals_(this), 46 render_widget_scheduler_signals_(this),
45 control_task_runner_(helper_.ControlTaskRunner()), 47 control_task_runner_(helper_.ControlTaskRunner()),
46 compositor_task_runner_( 48 compositor_task_runner_(
47 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") 49 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq")
48 .SetShouldMonitorQuiescence(true))), 50 .SetShouldMonitorQuiescence(true))),
49 delayed_update_policy_runner_( 51 delayed_update_policy_runner_(
50 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 52 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
51 base::Unretained(this)), 53 base::Unretained(this)),
52 helper_.ControlTaskRunner()), 54 helper_.ControlTaskRunner()),
53 main_thread_only_(compositor_task_runner_, 55 main_thread_only_(compositor_task_runner_,
54 helper_.scheduler_tqm_delegate().get()), 56 helper_.scheduler_tqm_delegate().get()),
55 policy_may_need_update_(&any_thread_lock_), 57 policy_may_need_update_(&any_thread_lock_),
56 weak_factory_(this) { 58 weak_factory_(this) {
57 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 59 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
58 weak_factory_.GetWeakPtr()); 60 weak_factory_.GetWeakPtr());
59 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 61 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
60 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 62 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
61 63
62 suspend_timers_when_backgrounded_closure_.Reset( 64 suspend_timers_when_backgrounded_closure_.Reset(
63 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 65 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
64 weak_factory_.GetWeakPtr())); 66 weak_factory_.GetWeakPtr()));
65 67
66 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); 68 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq");
67 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); 69 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq");
68 70
71 virtual_time_domain_ = make_scoped_refptr(
72 new VirtualTimeDomain(helper_.scheduler_tqm_delegate()->NowTicks()));
73 helper_.RegisterTimeDomain(virtual_time_domain_);
74
69 TRACE_EVENT_OBJECT_CREATED_WITH_ID( 75 TRACE_EVENT_OBJECT_CREATED_WITH_ID(
70 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 76 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
71 this); 77 this);
72 78
73 helper_.SetObserver(this); 79 helper_.SetObserver(this);
74 } 80 }
75 81
76 RendererSchedulerImpl::~RendererSchedulerImpl() { 82 RendererSchedulerImpl::~RendererSchedulerImpl() {
77 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 83 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
78 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 84 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
79 this); 85 this);
80 86
87 helper_.UnregisterTimeDomain(virtual_time_domain_);
88
81 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { 89 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) {
82 loading_queue->RemoveTaskObserver( 90 loading_queue->RemoveTaskObserver(
83 &MainThreadOnly().loading_task_cost_estimator); 91 &MainThreadOnly().loading_task_cost_estimator);
84 } 92 }
85 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { 93 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) {
86 timer_queue->RemoveTaskObserver( 94 timer_queue->RemoveTaskObserver(
87 &MainThreadOnly().timer_task_cost_estimator); 95 &MainThreadOnly().timer_task_cost_estimator);
88 } 96 }
89 97
90 // Ensure the renderer scheduler was shut down explicitly, because otherwise 98 // Ensure the renderer scheduler was shut down explicitly, because otherwise
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 RendererSchedulerImpl::LoadingTaskRunner() { 177 RendererSchedulerImpl::LoadingTaskRunner() {
170 helper_.CheckOnValidThread(); 178 helper_.CheckOnValidThread();
171 return default_loading_task_runner_; 179 return default_loading_task_runner_;
172 } 180 }
173 181
174 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { 182 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() {
175 helper_.CheckOnValidThread(); 183 helper_.CheckOnValidThread();
176 return default_timer_task_runner_; 184 return default_timer_task_runner_;
177 } 185 }
178 186
187 scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskRunner() {
188 helper_.CheckOnValidThread();
189 return helper_.ControlTaskRunner();
190 }
191
179 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( 192 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner(
180 const char* name) { 193 const char* name) {
181 helper_.CheckOnValidThread(); 194 helper_.CheckOnValidThread();
182 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( 195 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue(
183 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); 196 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true)));
184 loading_task_runners_.insert(loading_task_queue); 197 loading_task_runners_.insert(loading_task_queue);
185 loading_task_queue->SetQueuePriority( 198 loading_task_queue->SetQueuePriority(
186 MainThreadOnly().current_policy.loading_queue_priority); 199 MainThreadOnly().current_policy.loading_queue_priority);
187 loading_task_queue->AddTaskObserver( 200 loading_task_queue->AddTaskObserver(
188 &MainThreadOnly().loading_task_cost_estimator); 201 &MainThreadOnly().loading_task_cost_estimator);
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 1052
1040 double RendererSchedulerImpl::CurrentTimeSeconds() const { 1053 double RendererSchedulerImpl::CurrentTimeSeconds() const {
1041 return helper_.scheduler_tqm_delegate()->CurrentTimeSeconds(); 1054 return helper_.scheduler_tqm_delegate()->CurrentTimeSeconds();
1042 } 1055 }
1043 1056
1044 double RendererSchedulerImpl::MonotonicallyIncreasingTimeSeconds() const { 1057 double RendererSchedulerImpl::MonotonicallyIncreasingTimeSeconds() const {
1045 return helper_.scheduler_tqm_delegate()->NowTicks().ToInternalValue() / 1058 return helper_.scheduler_tqm_delegate()->NowTicks().ToInternalValue() /
1046 static_cast<double>(base::Time::kMicrosecondsPerSecond); 1059 static_cast<double>(base::Time::kMicrosecondsPerSecond);
1047 } 1060 }
1048 1061
1062 void RendererSchedulerImpl::RegisterTimeDomain(
1063 const scoped_refptr<TimeDomain>& time_domain) {
1064 helper_.RegisterTimeDomain(time_domain);
1065 }
1066
1067 void RendererSchedulerImpl::UnregisterTimeDomain(
1068 const scoped_refptr<TimeDomain>& time_domain) {
1069 helper_.UnregisterTimeDomain(time_domain);
1070 }
1071
1049 } // namespace scheduler 1072 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698