| 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()) | 
| 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 | 
|---|