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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2258133002: [scheduler] Implement time-based cpu throttling. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 2 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 "platform/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "platform/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/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "base/trace_event/trace_event_argument.h" 13 #include "base/trace_event/trace_event_argument.h"
14 #include "cc/output/begin_frame_args.h" 14 #include "cc/output/begin_frame_args.h"
15 #include "platform/scheduler/base/task_queue_impl.h" 15 #include "platform/scheduler/base/task_queue_impl.h"
16 #include "platform/scheduler/base/task_queue_selector.h" 16 #include "platform/scheduler/base/task_queue_selector.h"
17 #include "platform/scheduler/base/virtual_time_domain.h" 17 #include "platform/scheduler/base/virtual_time_domain.h"
18 #include "platform/scheduler/child/scheduler_tqm_delegate.h" 18 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
19 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h" 19 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h"
20 #include "platform/scheduler/renderer/task_queue_throttler.h"
20 #include "platform/scheduler/renderer/web_view_scheduler_impl.h" 21 #include "platform/scheduler/renderer/web_view_scheduler_impl.h"
21 #include "platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" 22 #include "platform/scheduler/renderer/webthread_impl_for_renderer_scheduler.h"
22 23
23 namespace blink { 24 namespace blink {
24 namespace scheduler { 25 namespace scheduler {
25 namespace { 26 namespace {
26 // The run time of loading tasks is strongly bimodal. The vast majority are 27 // The run time of loading tasks is strongly bimodal. The vast majority are
27 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 28 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1
28 // second on a mobile device) so we take a very pessimistic view when estimating 29 // second on a mobile device) so we take a very pessimistic view when estimating
29 // the cost of loading tasks. 30 // the cost of loading tasks.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 delayed_update_policy_runner_( 80 delayed_update_policy_runner_(
80 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 81 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
81 base::Unretained(this)), 82 base::Unretained(this)),
82 helper_.ControlTaskRunner()), 83 helper_.ControlTaskRunner()),
83 main_thread_only_(this, 84 main_thread_only_(this,
84 compositor_task_runner_, 85 compositor_task_runner_,
85 helper_.scheduler_tqm_delegate().get(), 86 helper_.scheduler_tqm_delegate().get(),
86 helper_.scheduler_tqm_delegate()->NowTicks()), 87 helper_.scheduler_tqm_delegate()->NowTicks()),
87 policy_may_need_update_(&any_thread_lock_), 88 policy_may_need_update_(&any_thread_lock_),
88 weak_factory_(this) { 89 weak_factory_(this) {
89 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); 90 task_queue_throttler_.reset(
91 new TaskQueueThrottler(this, "renderer.scheduler"));
90 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 92 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
91 weak_factory_.GetWeakPtr()); 93 weak_factory_.GetWeakPtr());
92 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 94 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
93 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 95 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
94 96
95 suspend_timers_when_backgrounded_closure_.Reset( 97 suspend_timers_when_backgrounded_closure_.Reset(
96 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 98 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
97 weak_factory_.GetWeakPtr())); 99 weak_factory_.GetWeakPtr()));
98 100
99 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); 101 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq");
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() 194 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
193 : last_input_type(blink::WebInputEvent::Undefined) {} 195 : last_input_type(blink::WebInputEvent::Undefined) {}
194 196
195 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} 197 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
196 198
197 void RendererSchedulerImpl::Shutdown() { 199 void RendererSchedulerImpl::Shutdown() {
198 base::TimeTicks now = tick_clock()->NowTicks(); 200 base::TimeTicks now = tick_clock()->NowTicks();
199 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); 201 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
200 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); 202 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
201 203
202 throttling_helper_.reset(); 204 task_queue_throttler_.reset();
203 helper_.Shutdown(); 205 helper_.Shutdown();
204 MainThreadOnly().was_shutdown = true; 206 MainThreadOnly().was_shutdown = true;
205 MainThreadOnly().rail_mode_observer = nullptr; 207 MainThreadOnly().rail_mode_observer = nullptr;
206 } 208 }
207 209
208 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { 210 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() {
209 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); 211 return base::MakeUnique<WebThreadImplForRendererScheduler>(this);
210 } 212 }
211 213
212 scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskRunner() { 214 scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskRunner() {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( 247 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain(
246 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() 248 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain()
247 : nullptr))); 249 : nullptr)));
248 loading_task_runners_.insert(loading_task_queue); 250 loading_task_runners_.insert(loading_task_queue);
249 loading_task_queue->SetQueueEnabled( 251 loading_task_queue->SetQueueEnabled(
250 MainThreadOnly().current_policy.loading_queue_policy.is_enabled); 252 MainThreadOnly().current_policy.loading_queue_policy.is_enabled);
251 loading_task_queue->SetQueuePriority( 253 loading_task_queue->SetQueuePriority(
252 MainThreadOnly().current_policy.loading_queue_policy.priority); 254 MainThreadOnly().current_policy.loading_queue_policy.priority);
253 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type == 255 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type ==
254 TimeDomainType::THROTTLED) { 256 TimeDomainType::THROTTLED) {
255 throttling_helper_->IncreaseThrottleRefCount(loading_task_queue.get()); 257 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get());
256 } 258 }
257 loading_task_queue->AddTaskObserver( 259 loading_task_queue->AddTaskObserver(
258 &MainThreadOnly().loading_task_cost_estimator); 260 &MainThreadOnly().loading_task_cost_estimator);
259 return loading_task_queue; 261 return loading_task_queue;
260 } 262 }
261 263
262 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( 264 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner(
263 const char* name) { 265 const char* name) {
264 helper_.CheckOnValidThread(); 266 helper_.CheckOnValidThread();
265 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. 267 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
266 scoped_refptr<TaskQueue> timer_task_queue( 268 scoped_refptr<TaskQueue> timer_task_queue(
267 helper_.NewTaskQueue(TaskQueue::Spec(name) 269 helper_.NewTaskQueue(TaskQueue::Spec(name)
268 .SetShouldMonitorQuiescence(true) 270 .SetShouldMonitorQuiescence(true)
269 .SetShouldReportWhenExecutionBlocked(true) 271 .SetShouldReportWhenExecutionBlocked(true)
270 .SetTimeDomain(MainThreadOnly().use_virtual_time 272 .SetTimeDomain(MainThreadOnly().use_virtual_time
271 ? GetVirtualTimeDomain() 273 ? GetVirtualTimeDomain()
272 : nullptr))); 274 : nullptr)));
273 timer_task_runners_.insert(timer_task_queue); 275 timer_task_runners_.insert(timer_task_queue);
274 timer_task_queue->SetQueueEnabled( 276 timer_task_queue->SetQueueEnabled(
275 MainThreadOnly().current_policy.timer_queue_policy.is_enabled); 277 MainThreadOnly().current_policy.timer_queue_policy.is_enabled);
276 timer_task_queue->SetQueuePriority( 278 timer_task_queue->SetQueuePriority(
277 MainThreadOnly().current_policy.timer_queue_policy.priority); 279 MainThreadOnly().current_policy.timer_queue_policy.priority);
278 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type == 280 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type ==
279 TimeDomainType::THROTTLED) { 281 TimeDomainType::THROTTLED) {
280 throttling_helper_->IncreaseThrottleRefCount(timer_task_queue.get()); 282 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get());
281 } 283 }
282 timer_task_queue->AddTaskObserver( 284 timer_task_queue->AddTaskObserver(
283 &MainThreadOnly().timer_task_cost_estimator); 285 &MainThreadOnly().timer_task_cost_estimator);
284 return timer_task_queue; 286 return timer_task_queue;
285 } 287 }
286 288
287 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( 289 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner(
288 const char* name) { 290 const char* name) {
289 helper_.CheckOnValidThread(); 291 helper_.CheckOnValidThread();
290 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( 292 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
291 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( 293 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain(
292 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() 294 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain()
293 : nullptr))); 295 : nullptr)));
294 unthrottled_task_runners_.insert(unthrottled_task_queue); 296 unthrottled_task_runners_.insert(unthrottled_task_queue);
295 return unthrottled_task_queue; 297 return unthrottled_task_queue;
296 } 298 }
297 299
298 std::unique_ptr<RenderWidgetSchedulingState> 300 std::unique_ptr<RenderWidgetSchedulingState>
299 RendererSchedulerImpl::NewRenderWidgetSchedulingState() { 301 RendererSchedulerImpl::NewRenderWidgetSchedulingState() {
300 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState(); 302 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState();
301 } 303 }
302 304
303 void RendererSchedulerImpl::OnUnregisterTaskQueue( 305 void RendererSchedulerImpl::OnUnregisterTaskQueue(
304 const scoped_refptr<TaskQueue>& task_queue) { 306 const scoped_refptr<TaskQueue>& task_queue) {
305 if (throttling_helper_.get()) 307 if (task_queue_throttler_)
306 throttling_helper_->UnregisterTaskQueue(task_queue.get()); 308 task_queue_throttler_->UnregisterTaskQueue(task_queue.get());
307 309
308 if (loading_task_runners_.find(task_queue) != loading_task_runners_.end()) { 310 if (loading_task_runners_.find(task_queue) != loading_task_runners_.end()) {
309 task_queue->RemoveTaskObserver( 311 task_queue->RemoveTaskObserver(
310 &MainThreadOnly().loading_task_cost_estimator); 312 &MainThreadOnly().loading_task_cost_estimator);
311 loading_task_runners_.erase(task_queue); 313 loading_task_runners_.erase(task_queue);
312 } else if (timer_task_runners_.find(task_queue) != 314 } else if (timer_task_runners_.find(task_queue) !=
313 timer_task_runners_.end()) { 315 timer_task_runners_.end()) {
314 task_queue->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator); 316 task_queue->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator);
315 timer_task_runners_.erase(task_queue); 317 timer_task_runners_.erase(task_queue);
316 } else if (unthrottled_task_runners_.find(task_queue) != 318 } else if (unthrottled_task_runners_.find(task_queue) !=
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 control_task_runner_->PostDelayedTask( 409 control_task_runner_->PostDelayedTask(
408 FROM_HERE, end_renderer_hidden_idle_period_closure_.callback(), 410 FROM_HERE, end_renderer_hidden_idle_period_closure_.callback(),
409 end_idle_when_hidden_delay); 411 end_idle_when_hidden_delay);
410 MainThreadOnly().renderer_hidden = true; 412 MainThreadOnly().renderer_hidden = true;
411 } else { 413 } else {
412 MainThreadOnly().renderer_hidden = false; 414 MainThreadOnly().renderer_hidden = false;
413 EndIdlePeriod(); 415 EndIdlePeriod();
414 } 416 }
415 417
416 // TODO(alexclarke): Should we update policy here? 418 // TODO(alexclarke): Should we update policy here?
417 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 419 CreateTraceEventObjectSnapshot();
418 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
419 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks()));
420 } 420 }
421 421
422 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( 422 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler(
423 bool has_visible_render_widget_with_touch_handler) { 423 bool has_visible_render_widget_with_touch_handler) {
424 helper_.CheckOnValidThread(); 424 helper_.CheckOnValidThread();
425 if (has_visible_render_widget_with_touch_handler == 425 if (has_visible_render_widget_with_touch_handler ==
426 MainThreadOnly().has_visible_render_widget_with_touch_handler) 426 MainThreadOnly().has_visible_render_widget_with_touch_handler)
427 return; 427 return;
428 428
429 MainThreadOnly().has_visible_render_widget_with_touch_handler = 429 MainThreadOnly().has_visible_render_widget_with_touch_handler =
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 if (MainThreadOnly().use_virtual_time) { 956 if (MainThreadOnly().use_virtual_time) {
957 new_policy.compositor_queue_policy.time_domain_type = 957 new_policy.compositor_queue_policy.time_domain_type =
958 TimeDomainType::VIRTUAL; 958 TimeDomainType::VIRTUAL;
959 new_policy.default_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 959 new_policy.default_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
960 new_policy.loading_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 960 new_policy.loading_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
961 new_policy.timer_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 961 new_policy.timer_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
962 } 962 }
963 963
964 // Tracing is done before the early out check, because it's quite possible we 964 // Tracing is done before the early out check, because it's quite possible we
965 // will otherwise miss this information in traces. 965 // will otherwise miss this information in traces.
966 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 966 CreateTraceEventObjectSnapshotLocked();
967 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
968 this, AsValueLocked(now));
969 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "use_case", 967 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "use_case",
970 use_case); 968 use_case);
971 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "rail_mode", 969 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "rail_mode",
972 new_policy.rail_mode); 970 new_policy.rail_mode);
973 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 971 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
974 "touchstart_expected_soon", 972 "touchstart_expected_soon",
975 MainThreadOnly().touchstart_expected_soon); 973 MainThreadOnly().touchstart_expected_soon);
976 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 974 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
977 "expensive_task_policy", expensive_task_policy); 975 "expensive_task_policy", expensive_task_policy);
978 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 976 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 1018
1021 DCHECK(compositor_task_runner_->IsQueueEnabled()); 1019 DCHECK(compositor_task_runner_->IsQueueEnabled());
1022 MainThreadOnly().current_policy = new_policy; 1020 MainThreadOnly().current_policy = new_policy;
1023 } 1021 }
1024 1022
1025 void RendererSchedulerImpl::ApplyTaskQueuePolicy( 1023 void RendererSchedulerImpl::ApplyTaskQueuePolicy(
1026 TaskQueue* task_queue, 1024 TaskQueue* task_queue,
1027 const TaskQueuePolicy& old_task_queue_policy, 1025 const TaskQueuePolicy& old_task_queue_policy,
1028 const TaskQueuePolicy& new_task_queue_policy) const { 1026 const TaskQueuePolicy& new_task_queue_policy) const {
1029 if (old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) { 1027 if (old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) {
1030 throttling_helper_->SetQueueEnabled(task_queue, 1028 task_queue_throttler_->SetQueueEnabled(task_queue,
1031 new_task_queue_policy.is_enabled); 1029 new_task_queue_policy.is_enabled);
1032 } 1030 }
1033 1031
1034 if (old_task_queue_policy.priority != new_task_queue_policy.priority) 1032 if (old_task_queue_policy.priority != new_task_queue_policy.priority)
1035 task_queue->SetQueuePriority(new_task_queue_policy.priority); 1033 task_queue->SetQueuePriority(new_task_queue_policy.priority);
1036 1034
1037 if (old_task_queue_policy.time_domain_type != 1035 if (old_task_queue_policy.time_domain_type !=
1038 new_task_queue_policy.time_domain_type) { 1036 new_task_queue_policy.time_domain_type) {
1039 if (old_task_queue_policy.time_domain_type == TimeDomainType::THROTTLED) { 1037 if (old_task_queue_policy.time_domain_type == TimeDomainType::THROTTLED) {
1040 throttling_helper_->DecreaseThrottleRefCount(task_queue); 1038 task_queue_throttler_->DecreaseThrottleRefCount(task_queue);
1041 } else if (new_task_queue_policy.time_domain_type == 1039 } else if (new_task_queue_policy.time_domain_type ==
1042 TimeDomainType::THROTTLED) { 1040 TimeDomainType::THROTTLED) {
1043 throttling_helper_->IncreaseThrottleRefCount(task_queue); 1041 task_queue_throttler_->IncreaseThrottleRefCount(task_queue);
1044 } else if (new_task_queue_policy.time_domain_type == 1042 } else if (new_task_queue_policy.time_domain_type ==
1045 TimeDomainType::VIRTUAL) { 1043 TimeDomainType::VIRTUAL) {
1046 DCHECK(virtual_time_domain_); 1044 DCHECK(virtual_time_domain_);
1047 task_queue->SetTimeDomain(virtual_time_domain_.get()); 1045 task_queue->SetTimeDomain(virtual_time_domain_.get());
1048 } 1046 }
1049 } 1047 }
1050 } 1048 }
1051 1049
1052 RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase( 1050 RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase(
1053 base::TimeTicks now, 1051 base::TimeTicks now,
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1178 // Note that this will only take effect for the next backgrounded signal. 1176 // Note that this will only take effect for the next backgrounded signal.
1179 MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled = enabled; 1177 MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled = enabled;
1180 } 1178 }
1181 1179
1182 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 1180 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
1183 RendererSchedulerImpl::AsValue(base::TimeTicks optional_now) const { 1181 RendererSchedulerImpl::AsValue(base::TimeTicks optional_now) const {
1184 base::AutoLock lock(any_thread_lock_); 1182 base::AutoLock lock(any_thread_lock_);
1185 return AsValueLocked(optional_now); 1183 return AsValueLocked(optional_now);
1186 } 1184 }
1187 1185
1186 void RendererSchedulerImpl::CreateTraceEventObjectSnapshot() const {
1187 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1188 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1189 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks()));
1190 }
1191
1192 void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const {
1193 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1194 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1195 this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks()));
1196 }
1197
1188 // static 1198 // static
1189 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( 1199 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString(
1190 ExpensiveTaskPolicy expensive_task_policy) { 1200 ExpensiveTaskPolicy expensive_task_policy) {
1191 switch (expensive_task_policy) { 1201 switch (expensive_task_policy) {
1192 case ExpensiveTaskPolicy::RUN: 1202 case ExpensiveTaskPolicy::RUN:
1193 return "RUN"; 1203 return "RUN";
1194 case ExpensiveTaskPolicy::BLOCK: 1204 case ExpensiveTaskPolicy::BLOCK:
1195 return "BLOCK"; 1205 return "BLOCK";
1196 case ExpensiveTaskPolicy::THROTTLE: 1206 case ExpensiveTaskPolicy::THROTTLE:
1197 return "THROTTLE"; 1207 return "THROTTLE";
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 .InMillisecondsF()); 1296 .InMillisecondsF());
1287 state->SetBoolean("in_idle_period", AnyThread().in_idle_period); 1297 state->SetBoolean("in_idle_period", AnyThread().in_idle_period);
1288 1298
1289 state->SetString( 1299 state->SetString(
1290 "expensive_task_policy", 1300 "expensive_task_policy",
1291 ExpensiveTaskPolicyToString(MainThreadOnly().expensive_task_policy)); 1301 ExpensiveTaskPolicyToString(MainThreadOnly().expensive_task_policy));
1292 1302
1293 AnyThread().user_model.AsValueInto(state.get()); 1303 AnyThread().user_model.AsValueInto(state.get());
1294 render_widget_scheduler_signals_.AsValueInto(state.get()); 1304 render_widget_scheduler_signals_.AsValueInto(state.get());
1295 1305
1306 state->BeginDictionary("task_queue_throttler");
1307 task_queue_throttler_->AsValueInto(state.get(), optional_now);
1308 state->EndDictionary();
1309
1296 return std::move(state); 1310 return std::move(state);
1297 } 1311 }
1298 1312
1299 void RendererSchedulerImpl::OnIdlePeriodStarted() { 1313 void RendererSchedulerImpl::OnIdlePeriodStarted() {
1300 base::AutoLock lock(any_thread_lock_); 1314 base::AutoLock lock(any_thread_lock_);
1301 AnyThread().in_idle_period = true; 1315 AnyThread().in_idle_period = true;
1302 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); 1316 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);
1303 } 1317 }
1304 1318
1305 void RendererSchedulerImpl::OnIdlePeriodEnded() { 1319 void RendererSchedulerImpl::OnIdlePeriodEnded() {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 true; 1468 true;
1455 BroadcastIntervention( 1469 BroadcastIntervention(
1456 "Blink deferred a task in order to make scrolling smoother. " 1470 "Blink deferred a task in order to make scrolling smoother. "
1457 "Your timer and network tasks should take less than 50ms to run " 1471 "Your timer and network tasks should take less than 50ms to run "
1458 "to avoid this. Please see " 1472 "to avoid this. Please see "
1459 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" 1473 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail"
1460 " and https://crbug.com/574343#c40 for more information."); 1474 " and https://crbug.com/574343#c40 for more information.");
1461 } 1475 }
1462 } 1476 }
1463 1477
1464 void RendererSchedulerImpl::ReportTaskTime(double start_time, double end_time) { 1478 void RendererSchedulerImpl::ReportTaskTime(TaskQueue* task_queue,
1479 double start_time,
1480 double end_time) {
1481 // TODO(scheduler-dev): Remove conversions when Blink starts using
1482 // base::TimeTicks instead of doubles for time.
1465 base::TimeTicks start_time_ticks = 1483 base::TimeTicks start_time_ticks =
1466 MonotonicTimeInSecondsToTimeTicks(start_time); 1484 MonotonicTimeInSecondsToTimeTicks(start_time);
1467 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); 1485 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time);
1468 1486
1469 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted( 1487 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(
1470 start_time_ticks, end_time_ticks); 1488 start_time_ticks, end_time_ticks);
1489
1490 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
1491 end_time_ticks);
1492
1471 // We want to measure thread time here, but for efficiency reasons 1493 // We want to measure thread time here, but for efficiency reasons
1472 // we stick with wall time. 1494 // we stick with wall time.
1473 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( 1495 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
1474 start_time_ticks, end_time_ticks); 1496 start_time_ticks, end_time_ticks);
1475 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( 1497 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
1476 start_time_ticks, end_time_ticks); 1498 start_time_ticks, end_time_ticks);
1477 // TODO(altimin): Per-page metrics should also be considered. 1499 // TODO(altimin): Per-page metrics should also be considered.
1478 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", 1500 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
1479 (end_time_ticks - start_time_ticks).InMicroseconds (), 1, 1501 (end_time_ticks - start_time_ticks).InMicroseconds (), 1,
1480 1000000, 50); 1502 1000000, 50);
(...skipping 28 matching lines...) Expand all
1509 } 1531 }
1510 1532
1511 void RendererSchedulerImpl::EnableVirtualTime() { 1533 void RendererSchedulerImpl::EnableVirtualTime() {
1512 MainThreadOnly().use_virtual_time = true; 1534 MainThreadOnly().use_virtual_time = true;
1513 1535
1514 // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy(). 1536 // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy().
1515 AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain(); 1537 AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain();
1516 for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_) 1538 for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_)
1517 task_queue->SetTimeDomain(time_domain); 1539 task_queue->SetTimeDomain(time_domain);
1518 1540
1519 throttling_helper_->EnableVirtualTime(); 1541 task_queue_throttler_->EnableVirtualTime();
1520 1542
1521 ForceUpdatePolicy(); 1543 ForceUpdatePolicy();
1522 } 1544 }
1523 1545
1524 // static 1546 // static
1525 const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) { 1547 const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) {
1526 switch (use_case) { 1548 switch (use_case) {
1527 case UseCase::NONE: 1549 case UseCase::NONE:
1528 return "none"; 1550 return "none";
1529 case UseCase::COMPOSITOR_GESTURE: 1551 case UseCase::COMPOSITOR_GESTURE:
(...skipping 26 matching lines...) Expand all
1556 case v8::PERFORMANCE_LOAD: 1578 case v8::PERFORMANCE_LOAD:
1557 return "load"; 1579 return "load";
1558 default: 1580 default:
1559 NOTREACHED(); 1581 NOTREACHED();
1560 return nullptr; 1582 return nullptr;
1561 } 1583 }
1562 } 1584 }
1563 1585
1564 } // namespace scheduler 1586 } // namespace scheduler
1565 } // namespace blink 1587 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698