| 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" |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |