Chromium Code Reviews| 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 "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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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()) |
|
caseq
2016/09/22 00:52:34
nit: get() is redundant here.
altimin
2016/09/22 13:45:58
Thanks!
| |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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. |
| 1478 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", | 1499 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", |
| 1479 (end_time_ticks - start_time_ticks).InMicroseconds (), 1, | 1500 (end_time_ticks - start_time_ticks).InMicroseconds (), 1, |
| 1480 1000000, 50); | 1501 1000000, 50); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1509 } | 1530 } |
| 1510 | 1531 |
| 1511 void RendererSchedulerImpl::EnableVirtualTime() { | 1532 void RendererSchedulerImpl::EnableVirtualTime() { |
| 1512 MainThreadOnly().use_virtual_time = true; | 1533 MainThreadOnly().use_virtual_time = true; |
| 1513 | 1534 |
| 1514 // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy(). | 1535 // The |unthrottled_task_runners_| are not actively managed by UpdatePolicy(). |
| 1515 AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain(); | 1536 AutoAdvancingVirtualTimeDomain* time_domain = GetVirtualTimeDomain(); |
| 1516 for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_) | 1537 for (const scoped_refptr<TaskQueue>& task_queue : unthrottled_task_runners_) |
| 1517 task_queue->SetTimeDomain(time_domain); | 1538 task_queue->SetTimeDomain(time_domain); |
| 1518 | 1539 |
| 1519 throttling_helper_->EnableVirtualTime(); | 1540 task_queue_throttler_->EnableVirtualTime(); |
| 1520 | 1541 |
| 1521 ForceUpdatePolicy(); | 1542 ForceUpdatePolicy(); |
| 1522 } | 1543 } |
| 1523 | 1544 |
| 1524 // static | 1545 // static |
| 1525 const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) { | 1546 const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) { |
| 1526 switch (use_case) { | 1547 switch (use_case) { |
| 1527 case UseCase::NONE: | 1548 case UseCase::NONE: |
| 1528 return "none"; | 1549 return "none"; |
| 1529 case UseCase::COMPOSITOR_GESTURE: | 1550 case UseCase::COMPOSITOR_GESTURE: |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 1556 case v8::PERFORMANCE_LOAD: | 1577 case v8::PERFORMANCE_LOAD: |
| 1557 return "load"; | 1578 return "load"; |
| 1558 default: | 1579 default: |
| 1559 NOTREACHED(); | 1580 NOTREACHED(); |
| 1560 return nullptr; | 1581 return nullptr; |
| 1561 } | 1582 } |
| 1562 } | 1583 } |
| 1563 | 1584 |
| 1564 } // namespace scheduler | 1585 } // namespace scheduler |
| 1565 } // namespace blink | 1586 } // namespace blink |
| OLD | NEW |