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

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: Renamed Enable/Disable to Enable/DisableThrottling. Created 4 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 "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"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 delayed_update_policy_runner_( 79 delayed_update_policy_runner_(
80 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 80 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
81 base::Unretained(this)), 81 base::Unretained(this)),
82 helper_.ControlTaskRunner()), 82 helper_.ControlTaskRunner()),
83 main_thread_only_(this, 83 main_thread_only_(this,
84 compositor_task_runner_, 84 compositor_task_runner_,
85 helper_.scheduler_tqm_delegate().get(), 85 helper_.scheduler_tqm_delegate().get(),
86 helper_.scheduler_tqm_delegate()->NowTicks()), 86 helper_.scheduler_tqm_delegate()->NowTicks()),
87 policy_may_need_update_(&any_thread_lock_), 87 policy_may_need_update_(&any_thread_lock_),
88 weak_factory_(this) { 88 weak_factory_(this) {
89 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); 89 task_queue_throttler_.reset(
90 new TaskQueueThrottler(this, "renderer.scheduler"));
90 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 91 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
91 weak_factory_.GetWeakPtr()); 92 weak_factory_.GetWeakPtr());
92 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 93 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
93 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 94 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
94 95
95 suspend_timers_when_backgrounded_closure_.Reset( 96 suspend_timers_when_backgrounded_closure_.Reset(
96 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 97 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
97 weak_factory_.GetWeakPtr())); 98 weak_factory_.GetWeakPtr()));
98 99
99 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); 100 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq");
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() 193 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
193 : last_input_type(blink::WebInputEvent::Undefined) {} 194 : last_input_type(blink::WebInputEvent::Undefined) {}
194 195
195 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} 196 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
196 197
197 void RendererSchedulerImpl::Shutdown() { 198 void RendererSchedulerImpl::Shutdown() {
198 base::TimeTicks now = tick_clock()->NowTicks(); 199 base::TimeTicks now = tick_clock()->NowTicks();
199 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); 200 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
200 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); 201 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
201 202
202 throttling_helper_.reset(); 203 task_queue_throttler_.reset();
203 helper_.Shutdown(); 204 helper_.Shutdown();
204 MainThreadOnly().was_shutdown = true; 205 MainThreadOnly().was_shutdown = true;
205 MainThreadOnly().rail_mode_observer = nullptr; 206 MainThreadOnly().rail_mode_observer = nullptr;
206 } 207 }
207 208
208 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { 209 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() {
209 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); 210 return base::MakeUnique<WebThreadImplForRendererScheduler>(this);
210 } 211 }
211 212
212 scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskRunner() { 213 scoped_refptr<TaskQueue> RendererSchedulerImpl::DefaultTaskRunner() {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( 246 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain(
246 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() 247 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain()
247 : nullptr))); 248 : nullptr)));
248 loading_task_runners_.insert(loading_task_queue); 249 loading_task_runners_.insert(loading_task_queue);
249 loading_task_queue->SetQueueEnabled( 250 loading_task_queue->SetQueueEnabled(
250 MainThreadOnly().current_policy.loading_queue_policy.is_enabled); 251 MainThreadOnly().current_policy.loading_queue_policy.is_enabled);
251 loading_task_queue->SetQueuePriority( 252 loading_task_queue->SetQueuePriority(
252 MainThreadOnly().current_policy.loading_queue_policy.priority); 253 MainThreadOnly().current_policy.loading_queue_policy.priority);
253 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type == 254 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type ==
254 TimeDomainType::THROTTLED) { 255 TimeDomainType::THROTTLED) {
255 throttling_helper_->IncreaseThrottleRefCount(loading_task_queue.get()); 256 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get());
256 } 257 }
257 loading_task_queue->AddTaskObserver( 258 loading_task_queue->AddTaskObserver(
258 &MainThreadOnly().loading_task_cost_estimator); 259 &MainThreadOnly().loading_task_cost_estimator);
259 return loading_task_queue; 260 return loading_task_queue;
260 } 261 }
261 262
262 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( 263 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner(
263 const char* name) { 264 const char* name) {
264 helper_.CheckOnValidThread(); 265 helper_.CheckOnValidThread();
265 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. 266 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
266 scoped_refptr<TaskQueue> timer_task_queue( 267 scoped_refptr<TaskQueue> timer_task_queue(
267 helper_.NewTaskQueue(TaskQueue::Spec(name) 268 helper_.NewTaskQueue(TaskQueue::Spec(name)
268 .SetShouldMonitorQuiescence(true) 269 .SetShouldMonitorQuiescence(true)
269 .SetShouldReportWhenExecutionBlocked(true) 270 .SetShouldReportWhenExecutionBlocked(true)
270 .SetTimeDomain(MainThreadOnly().use_virtual_time 271 .SetTimeDomain(MainThreadOnly().use_virtual_time
271 ? GetVirtualTimeDomain() 272 ? GetVirtualTimeDomain()
272 : nullptr))); 273 : nullptr)));
273 timer_task_runners_.insert(timer_task_queue); 274 timer_task_runners_.insert(timer_task_queue);
274 timer_task_queue->SetQueueEnabled( 275 timer_task_queue->SetQueueEnabled(
275 MainThreadOnly().current_policy.timer_queue_policy.is_enabled); 276 MainThreadOnly().current_policy.timer_queue_policy.is_enabled);
276 timer_task_queue->SetQueuePriority( 277 timer_task_queue->SetQueuePriority(
277 MainThreadOnly().current_policy.timer_queue_policy.priority); 278 MainThreadOnly().current_policy.timer_queue_policy.priority);
278 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type == 279 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type ==
279 TimeDomainType::THROTTLED) { 280 TimeDomainType::THROTTLED) {
280 throttling_helper_->IncreaseThrottleRefCount(timer_task_queue.get()); 281 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get());
281 } 282 }
282 timer_task_queue->AddTaskObserver( 283 timer_task_queue->AddTaskObserver(
283 &MainThreadOnly().timer_task_cost_estimator); 284 &MainThreadOnly().timer_task_cost_estimator);
284 return timer_task_queue; 285 return timer_task_queue;
285 } 286 }
286 287
287 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( 288 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner(
288 const char* name) { 289 const char* name) {
289 helper_.CheckOnValidThread(); 290 helper_.CheckOnValidThread();
290 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( 291 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
291 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( 292 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain(
292 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() 293 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain()
293 : nullptr))); 294 : nullptr)));
294 unthrottled_task_runners_.insert(unthrottled_task_queue); 295 unthrottled_task_runners_.insert(unthrottled_task_queue);
295 return unthrottled_task_queue; 296 return unthrottled_task_queue;
296 } 297 }
297 298
298 std::unique_ptr<RenderWidgetSchedulingState> 299 std::unique_ptr<RenderWidgetSchedulingState>
299 RendererSchedulerImpl::NewRenderWidgetSchedulingState() { 300 RendererSchedulerImpl::NewRenderWidgetSchedulingState() {
300 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState(); 301 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState();
301 } 302 }
302 303
303 void RendererSchedulerImpl::OnUnregisterTaskQueue( 304 void RendererSchedulerImpl::OnUnregisterTaskQueue(
304 const scoped_refptr<TaskQueue>& task_queue) { 305 const scoped_refptr<TaskQueue>& task_queue) {
305 if (throttling_helper_.get()) 306 if (task_queue_throttler_.get())
306 throttling_helper_->UnregisterTaskQueue(task_queue.get()); 307 task_queue_throttler_->UnregisterTaskQueue(task_queue.get());
307 308
308 if (loading_task_runners_.find(task_queue) != loading_task_runners_.end()) { 309 if (loading_task_runners_.find(task_queue) != loading_task_runners_.end()) {
309 task_queue->RemoveTaskObserver( 310 task_queue->RemoveTaskObserver(
310 &MainThreadOnly().loading_task_cost_estimator); 311 &MainThreadOnly().loading_task_cost_estimator);
311 loading_task_runners_.erase(task_queue); 312 loading_task_runners_.erase(task_queue);
312 } else if (timer_task_runners_.find(task_queue) != 313 } else if (timer_task_runners_.find(task_queue) !=
313 timer_task_runners_.end()) { 314 timer_task_runners_.end()) {
314 task_queue->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator); 315 task_queue->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator);
315 timer_task_runners_.erase(task_queue); 316 timer_task_runners_.erase(task_queue);
316 } else if (unthrottled_task_runners_.find(task_queue) != 317 } 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( 408 control_task_runner_->PostDelayedTask(
408 FROM_HERE, end_renderer_hidden_idle_period_closure_.callback(), 409 FROM_HERE, end_renderer_hidden_idle_period_closure_.callback(),
409 end_idle_when_hidden_delay); 410 end_idle_when_hidden_delay);
410 MainThreadOnly().renderer_hidden = true; 411 MainThreadOnly().renderer_hidden = true;
411 } else { 412 } else {
412 MainThreadOnly().renderer_hidden = false; 413 MainThreadOnly().renderer_hidden = false;
413 EndIdlePeriod(); 414 EndIdlePeriod();
414 } 415 }
415 416
416 // TODO(alexclarke): Should we update policy here? 417 // TODO(alexclarke): Should we update policy here?
417 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 418 CreateTraceEventObjectSnapshot();
418 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
419 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks()));
420 } 419 }
421 420
422 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( 421 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler(
423 bool has_visible_render_widget_with_touch_handler) { 422 bool has_visible_render_widget_with_touch_handler) {
424 helper_.CheckOnValidThread(); 423 helper_.CheckOnValidThread();
425 if (has_visible_render_widget_with_touch_handler == 424 if (has_visible_render_widget_with_touch_handler ==
426 MainThreadOnly().has_visible_render_widget_with_touch_handler) 425 MainThreadOnly().has_visible_render_widget_with_touch_handler)
427 return; 426 return;
428 427
429 MainThreadOnly().has_visible_render_widget_with_touch_handler = 428 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) { 955 if (MainThreadOnly().use_virtual_time) {
957 new_policy.compositor_queue_policy.time_domain_type = 956 new_policy.compositor_queue_policy.time_domain_type =
958 TimeDomainType::VIRTUAL; 957 TimeDomainType::VIRTUAL;
959 new_policy.default_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 958 new_policy.default_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
960 new_policy.loading_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 959 new_policy.loading_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
961 new_policy.timer_queue_policy.time_domain_type = TimeDomainType::VIRTUAL; 960 new_policy.timer_queue_policy.time_domain_type = TimeDomainType::VIRTUAL;
962 } 961 }
963 962
964 // Tracing is done before the early out check, because it's quite possible we 963 // Tracing is done before the early out check, because it's quite possible we
965 // will otherwise miss this information in traces. 964 // will otherwise miss this information in traces.
966 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 965 CreateTraceEventObjectSnapshotLocked();
967 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
968 this, AsValueLocked(now));
969 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "use_case", 966 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "use_case",
970 use_case); 967 use_case);
971 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "rail_mode", 968 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "rail_mode",
972 new_policy.rail_mode); 969 new_policy.rail_mode);
973 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 970 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
974 "touchstart_expected_soon", 971 "touchstart_expected_soon",
975 MainThreadOnly().touchstart_expected_soon); 972 MainThreadOnly().touchstart_expected_soon);
976 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 973 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
977 "expensive_task_policy", expensive_task_policy); 974 "expensive_task_policy", expensive_task_policy);
978 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 975 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 1017
1021 DCHECK(compositor_task_runner_->IsQueueEnabled()); 1018 DCHECK(compositor_task_runner_->IsQueueEnabled());
1022 MainThreadOnly().current_policy = new_policy; 1019 MainThreadOnly().current_policy = new_policy;
1023 } 1020 }
1024 1021
1025 void RendererSchedulerImpl::ApplyTaskQueuePolicy( 1022 void RendererSchedulerImpl::ApplyTaskQueuePolicy(
1026 TaskQueue* task_queue, 1023 TaskQueue* task_queue,
1027 const TaskQueuePolicy& old_task_queue_policy, 1024 const TaskQueuePolicy& old_task_queue_policy,
1028 const TaskQueuePolicy& new_task_queue_policy) const { 1025 const TaskQueuePolicy& new_task_queue_policy) const {
1029 if (old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) { 1026 if (old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) {
1030 throttling_helper_->SetQueueEnabled(task_queue, 1027 task_queue_throttler_->SetQueueEnabled(task_queue,
1031 new_task_queue_policy.is_enabled); 1028 new_task_queue_policy.is_enabled);
1032 } 1029 }
1033 1030
1034 if (old_task_queue_policy.priority != new_task_queue_policy.priority) 1031 if (old_task_queue_policy.priority != new_task_queue_policy.priority)
1035 task_queue->SetQueuePriority(new_task_queue_policy.priority); 1032 task_queue->SetQueuePriority(new_task_queue_policy.priority);
1036 1033
1037 if (old_task_queue_policy.time_domain_type != 1034 if (old_task_queue_policy.time_domain_type !=
1038 new_task_queue_policy.time_domain_type) { 1035 new_task_queue_policy.time_domain_type) {
1039 if (old_task_queue_policy.time_domain_type == TimeDomainType::THROTTLED) { 1036 if (old_task_queue_policy.time_domain_type == TimeDomainType::THROTTLED) {
1040 throttling_helper_->DecreaseThrottleRefCount(task_queue); 1037 task_queue_throttler_->DecreaseThrottleRefCount(task_queue);
1041 } else if (new_task_queue_policy.time_domain_type == 1038 } else if (new_task_queue_policy.time_domain_type ==
1042 TimeDomainType::THROTTLED) { 1039 TimeDomainType::THROTTLED) {
1043 throttling_helper_->IncreaseThrottleRefCount(task_queue); 1040 task_queue_throttler_->IncreaseThrottleRefCount(task_queue);
1044 } else if (new_task_queue_policy.time_domain_type == 1041 } else if (new_task_queue_policy.time_domain_type ==
1045 TimeDomainType::VIRTUAL) { 1042 TimeDomainType::VIRTUAL) {
1046 DCHECK(virtual_time_domain_); 1043 DCHECK(virtual_time_domain_);
1047 task_queue->SetTimeDomain(virtual_time_domain_.get()); 1044 task_queue->SetTimeDomain(virtual_time_domain_.get());
1048 } 1045 }
1049 } 1046 }
1050 } 1047 }
1051 1048
1052 RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase( 1049 RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase(
1053 base::TimeTicks now, 1050 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. 1175 // Note that this will only take effect for the next backgrounded signal.
1179 MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled = enabled; 1176 MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled = enabled;
1180 } 1177 }
1181 1178
1182 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 1179 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
1183 RendererSchedulerImpl::AsValue(base::TimeTicks optional_now) const { 1180 RendererSchedulerImpl::AsValue(base::TimeTicks optional_now) const {
1184 base::AutoLock lock(any_thread_lock_); 1181 base::AutoLock lock(any_thread_lock_);
1185 return AsValueLocked(optional_now); 1182 return AsValueLocked(optional_now);
1186 } 1183 }
1187 1184
1185 void RendererSchedulerImpl::CreateTraceEventObjectSnapshot() const {
1186 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1187 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1188 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks()));
1189 }
1190
1191 void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const {
1192 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1193 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1194 this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks()));
1195 }
1196
1188 // static 1197 // static
1189 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( 1198 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString(
1190 ExpensiveTaskPolicy expensive_task_policy) { 1199 ExpensiveTaskPolicy expensive_task_policy) {
1191 switch (expensive_task_policy) { 1200 switch (expensive_task_policy) {
1192 case ExpensiveTaskPolicy::RUN: 1201 case ExpensiveTaskPolicy::RUN:
1193 return "RUN"; 1202 return "RUN";
1194 case ExpensiveTaskPolicy::BLOCK: 1203 case ExpensiveTaskPolicy::BLOCK:
1195 return "BLOCK"; 1204 return "BLOCK";
1196 case ExpensiveTaskPolicy::THROTTLE: 1205 case ExpensiveTaskPolicy::THROTTLE:
1197 return "THROTTLE"; 1206 return "THROTTLE";
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1286 .InMillisecondsF()); 1295 .InMillisecondsF());
1287 state->SetBoolean("in_idle_period", AnyThread().in_idle_period); 1296 state->SetBoolean("in_idle_period", AnyThread().in_idle_period);
1288 1297
1289 state->SetString( 1298 state->SetString(
1290 "expensive_task_policy", 1299 "expensive_task_policy",
1291 ExpensiveTaskPolicyToString(MainThreadOnly().expensive_task_policy)); 1300 ExpensiveTaskPolicyToString(MainThreadOnly().expensive_task_policy));
1292 1301
1293 AnyThread().user_model.AsValueInto(state.get()); 1302 AnyThread().user_model.AsValueInto(state.get());
1294 render_widget_scheduler_signals_.AsValueInto(state.get()); 1303 render_widget_scheduler_signals_.AsValueInto(state.get());
1295 1304
1305 state->BeginDictionary("task_queue_throttler");
1306 task_queue_throttler_->AsValueInto(state.get(), optional_now);
1307 state->EndDictionary();
1308
1296 return std::move(state); 1309 return std::move(state);
1297 } 1310 }
1298 1311
1299 void RendererSchedulerImpl::OnIdlePeriodStarted() { 1312 void RendererSchedulerImpl::OnIdlePeriodStarted() {
1300 base::AutoLock lock(any_thread_lock_); 1313 base::AutoLock lock(any_thread_lock_);
1301 AnyThread().in_idle_period = true; 1314 AnyThread().in_idle_period = true;
1302 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); 1315 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);
1303 } 1316 }
1304 1317
1305 void RendererSchedulerImpl::OnIdlePeriodEnded() { 1318 void RendererSchedulerImpl::OnIdlePeriodEnded() {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1454 true; 1467 true;
1455 BroadcastIntervention( 1468 BroadcastIntervention(
1456 "Blink deferred a task in order to make scrolling smoother. " 1469 "Blink deferred a task in order to make scrolling smoother. "
1457 "Your timer and network tasks should take less than 50ms to run " 1470 "Your timer and network tasks should take less than 50ms to run "
1458 "to avoid this. Please see " 1471 "to avoid this. Please see "
1459 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" 1472 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail"
1460 " and https://crbug.com/574343#c40 for more information."); 1473 " and https://crbug.com/574343#c40 for more information.");
1461 } 1474 }
1462 } 1475 }
1463 1476
1464 void RendererSchedulerImpl::ReportTaskTime(double start_time, double end_time) { 1477 void RendererSchedulerImpl::ReportTaskTime(TaskQueue* task_queue,
1478 double start_time,
1479 double end_time) {
1480 // TODO(scheduler-dev): Remove conversions when Blink starts using
1481 // base::TimeTicks instead of doubles for time.
1465 base::TimeTicks start_time_ticks = 1482 base::TimeTicks start_time_ticks =
1466 MonotonicTimeInSecondsToTimeTicks(start_time); 1483 MonotonicTimeInSecondsToTimeTicks(start_time);
1467 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); 1484 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time);
1468 1485
1469 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted( 1486 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(
1470 start_time_ticks, end_time_ticks); 1487 start_time_ticks, end_time_ticks);
1488
1489 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
1490 end_time_ticks);
1491
1471 // We want to measure thread time here, but for efficiency reasons 1492 // We want to measure thread time here, but for efficiency reasons
1472 // we stick with wall time. 1493 // we stick with wall time.
1473 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( 1494 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
1474 start_time_ticks, end_time_ticks); 1495 start_time_ticks, end_time_ticks);
1475 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( 1496 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
1476 start_time_ticks, end_time_ticks); 1497 start_time_ticks, end_time_ticks);
1477 // TODO(altimin): Per-page metrics should also be considered. 1498 // TODO(altimin): Per-page metrics should also be considered.
1499
alex clarke (OOO till 29th) 2016/09/15 12:19:35 nit: remove blank line
altimin 2016/09/15 15:52:10 Done.
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);
1481 } 1503 }
1482 1504
1483 void RendererSchedulerImpl::AddTaskTimeObserver( 1505 void RendererSchedulerImpl::AddTaskTimeObserver(
1484 TaskTimeObserver* task_time_observer) { 1506 TaskTimeObserver* task_time_observer) {
1485 helper_.AddTaskTimeObserver(task_time_observer); 1507 helper_.AddTaskTimeObserver(task_time_observer);
1486 } 1508 }
1487 1509
(...skipping 21 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