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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 72 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
73 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 73 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
74 idle_helper_(&helper_, | 74 idle_helper_(&helper_, |
75 this, | 75 this, |
76 "renderer.scheduler", | 76 "renderer.scheduler", |
77 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 77 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
78 "RendererSchedulerIdlePeriod", | 78 "RendererSchedulerIdlePeriod", |
79 base::TimeDelta()), | 79 base::TimeDelta()), |
80 render_widget_scheduler_signals_(this), | 80 render_widget_scheduler_signals_(this), |
81 control_task_runner_(helper_.ControlTaskRunner()), | 81 control_task_runner_(helper_.ControlTaskRunner()), |
82 compositor_task_runner_(helper_.NewTaskQueue( | 82 compositor_task_runner_( |
83 TaskQueue::Spec("compositor_tq").SetShouldMonitorQuiescence(true))), | 83 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) |
| 84 .SetShouldMonitorQuiescence(true))), |
84 delayed_update_policy_runner_( | 85 delayed_update_policy_runner_( |
85 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 86 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
86 base::Unretained(this)), | 87 base::Unretained(this)), |
87 helper_.ControlTaskRunner()), | 88 helper_.ControlTaskRunner()), |
88 main_thread_only_(this, | 89 main_thread_only_(this, |
89 compositor_task_runner_, | 90 compositor_task_runner_, |
90 helper_.scheduler_tqm_delegate().get(), | 91 helper_.scheduler_tqm_delegate().get(), |
91 helper_.scheduler_tqm_delegate()->NowTicks()), | 92 helper_.scheduler_tqm_delegate()->NowTicks()), |
92 policy_may_need_update_(&any_thread_lock_), | 93 policy_may_need_update_(&any_thread_lock_), |
93 weak_factory_(this) { | 94 weak_factory_(this) { |
94 task_queue_throttler_.reset( | 95 task_queue_throttler_.reset( |
95 new TaskQueueThrottler(this, "renderer.scheduler")); | 96 new TaskQueueThrottler(this, "renderer.scheduler")); |
96 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 97 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
97 weak_factory_.GetWeakPtr()); | 98 weak_factory_.GetWeakPtr()); |
98 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 99 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
99 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 100 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
100 | 101 |
101 suspend_timers_when_backgrounded_closure_.Reset( | 102 suspend_timers_when_backgrounded_closure_.Reset( |
102 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 103 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
103 weak_factory_.GetWeakPtr())); | 104 weak_factory_.GetWeakPtr())); |
104 | 105 |
105 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); | 106 default_loading_task_runner_ = |
106 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); | 107 NewLoadingTaskRunner(TaskQueue::QueueType::DEFAULT_LOADING); |
| 108 default_timer_task_runner_ = |
| 109 NewTimerTaskRunner(TaskQueue::QueueType::DEFAULT_TIMER); |
107 | 110 |
108 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 111 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
109 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 112 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
110 this); | 113 this); |
111 | 114 |
112 helper_.SetObserver(this); | 115 helper_.SetObserver(this); |
113 helper_.AddTaskTimeObserver(this); | 116 helper_.AddTaskTimeObserver(this); |
114 } | 117 } |
115 | 118 |
116 RendererSchedulerImpl::~RendererSchedulerImpl() { | 119 RendererSchedulerImpl::~RendererSchedulerImpl() { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 helper_.CheckOnValidThread(); | 245 helper_.CheckOnValidThread(); |
243 return default_timer_task_runner_; | 246 return default_timer_task_runner_; |
244 } | 247 } |
245 | 248 |
246 scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskRunner() { | 249 scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskRunner() { |
247 helper_.CheckOnValidThread(); | 250 helper_.CheckOnValidThread(); |
248 return helper_.ControlTaskRunner(); | 251 return helper_.ControlTaskRunner(); |
249 } | 252 } |
250 | 253 |
251 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( | 254 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( |
252 const char* name) { | 255 TaskQueue::QueueType queue_type) { |
253 helper_.CheckOnValidThread(); | 256 helper_.CheckOnValidThread(); |
254 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( | 257 scoped_refptr<TaskQueue> loading_task_queue( |
255 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( | 258 helper_.NewTaskQueue(TaskQueue::Spec(queue_type) |
256 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() | 259 .SetShouldMonitorQuiescence(true) |
257 : nullptr))); | 260 .SetTimeDomain(MainThreadOnly().use_virtual_time |
| 261 ? GetVirtualTimeDomain() |
| 262 : nullptr))); |
258 loading_task_runners_.insert(loading_task_queue); | 263 loading_task_runners_.insert(loading_task_queue); |
259 loading_task_queue->SetQueueEnabled( | 264 loading_task_queue->SetQueueEnabled( |
260 MainThreadOnly().current_policy.loading_queue_policy.is_enabled); | 265 MainThreadOnly().current_policy.loading_queue_policy.is_enabled); |
261 loading_task_queue->SetQueuePriority( | 266 loading_task_queue->SetQueuePriority( |
262 MainThreadOnly().current_policy.loading_queue_policy.priority); | 267 MainThreadOnly().current_policy.loading_queue_policy.priority); |
263 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type == | 268 if (MainThreadOnly().current_policy.loading_queue_policy.time_domain_type == |
264 TimeDomainType::THROTTLED) { | 269 TimeDomainType::THROTTLED) { |
265 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); | 270 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); |
266 } | 271 } |
267 loading_task_queue->AddTaskObserver( | 272 loading_task_queue->AddTaskObserver( |
268 &MainThreadOnly().loading_task_cost_estimator); | 273 &MainThreadOnly().loading_task_cost_estimator); |
269 return loading_task_queue; | 274 return loading_task_queue; |
270 } | 275 } |
271 | 276 |
272 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( | 277 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( |
273 const char* name) { | 278 TaskQueue::QueueType queue_type) { |
274 helper_.CheckOnValidThread(); | 279 helper_.CheckOnValidThread(); |
275 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. | 280 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. |
276 scoped_refptr<TaskQueue> timer_task_queue( | 281 scoped_refptr<TaskQueue> timer_task_queue( |
277 helper_.NewTaskQueue(TaskQueue::Spec(name) | 282 helper_.NewTaskQueue(TaskQueue::Spec(queue_type) |
278 .SetShouldMonitorQuiescence(true) | 283 .SetShouldMonitorQuiescence(true) |
279 .SetShouldReportWhenExecutionBlocked(true) | 284 .SetShouldReportWhenExecutionBlocked(true) |
280 .SetTimeDomain(MainThreadOnly().use_virtual_time | 285 .SetTimeDomain(MainThreadOnly().use_virtual_time |
281 ? GetVirtualTimeDomain() | 286 ? GetVirtualTimeDomain() |
282 : nullptr))); | 287 : nullptr))); |
283 timer_task_runners_.insert(timer_task_queue); | 288 timer_task_runners_.insert(timer_task_queue); |
284 timer_task_queue->SetQueueEnabled( | 289 timer_task_queue->SetQueueEnabled( |
285 MainThreadOnly().current_policy.timer_queue_policy.is_enabled); | 290 MainThreadOnly().current_policy.timer_queue_policy.is_enabled); |
286 timer_task_queue->SetQueuePriority( | 291 timer_task_queue->SetQueuePriority( |
287 MainThreadOnly().current_policy.timer_queue_policy.priority); | 292 MainThreadOnly().current_policy.timer_queue_policy.priority); |
288 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type == | 293 if (MainThreadOnly().current_policy.timer_queue_policy.time_domain_type == |
289 TimeDomainType::THROTTLED) { | 294 TimeDomainType::THROTTLED) { |
290 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); | 295 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); |
291 } | 296 } |
292 timer_task_queue->AddTaskObserver( | 297 timer_task_queue->AddTaskObserver( |
293 &MainThreadOnly().timer_task_cost_estimator); | 298 &MainThreadOnly().timer_task_cost_estimator); |
294 return timer_task_queue; | 299 return timer_task_queue; |
295 } | 300 } |
296 | 301 |
297 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( | 302 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( |
298 const char* name) { | 303 TaskQueue::QueueType queue_type) { |
299 helper_.CheckOnValidThread(); | 304 helper_.CheckOnValidThread(); |
300 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( | 305 scoped_refptr<TaskQueue> unthrottled_task_queue( |
301 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true).SetTimeDomain( | 306 helper_.NewTaskQueue(TaskQueue::Spec(queue_type) |
302 MainThreadOnly().use_virtual_time ? GetVirtualTimeDomain() | 307 .SetShouldMonitorQuiescence(true) |
303 : nullptr))); | 308 .SetTimeDomain(MainThreadOnly().use_virtual_time |
| 309 ? GetVirtualTimeDomain() |
| 310 : nullptr))); |
304 unthrottled_task_runners_.insert(unthrottled_task_queue); | 311 unthrottled_task_runners_.insert(unthrottled_task_queue); |
305 return unthrottled_task_queue; | 312 return unthrottled_task_queue; |
306 } | 313 } |
307 | 314 |
308 std::unique_ptr<RenderWidgetSchedulingState> | 315 std::unique_ptr<RenderWidgetSchedulingState> |
309 RendererSchedulerImpl::NewRenderWidgetSchedulingState() { | 316 RendererSchedulerImpl::NewRenderWidgetSchedulingState() { |
310 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState(); | 317 return render_widget_scheduler_signals_.NewRenderWidgetSchedulingState(); |
311 } | 318 } |
312 | 319 |
313 void RendererSchedulerImpl::OnUnregisterTaskQueue( | 320 void RendererSchedulerImpl::OnUnregisterTaskQueue( |
(...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1505 // We want to measure thread time here, but for efficiency reasons | 1512 // We want to measure thread time here, but for efficiency reasons |
1506 // we stick with wall time. | 1513 // we stick with wall time. |
1507 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( | 1514 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
1508 start_time_ticks, end_time_ticks); | 1515 start_time_ticks, end_time_ticks); |
1509 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( | 1516 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
1510 start_time_ticks, end_time_ticks); | 1517 start_time_ticks, end_time_ticks); |
1511 // TODO(altimin): Per-page metrics should also be considered. | 1518 // TODO(altimin): Per-page metrics should also be considered. |
1512 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", | 1519 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", |
1513 (end_time_ticks - start_time_ticks).InMicroseconds
(), 1, | 1520 (end_time_ticks - start_time_ticks).InMicroseconds
(), 1, |
1514 1000000, 50); | 1521 1000000, 50); |
| 1522 UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType", |
| 1523 static_cast<int>(task_queue->GetQueueType()), |
| 1524 static_cast<int>(TaskQueue::QueueType::COUNT)); |
1515 } | 1525 } |
1516 | 1526 |
1517 void RendererSchedulerImpl::AddTaskTimeObserver( | 1527 void RendererSchedulerImpl::AddTaskTimeObserver( |
1518 TaskTimeObserver* task_time_observer) { | 1528 TaskTimeObserver* task_time_observer) { |
1519 helper_.AddTaskTimeObserver(task_time_observer); | 1529 helper_.AddTaskTimeObserver(task_time_observer); |
1520 } | 1530 } |
1521 | 1531 |
1522 void RendererSchedulerImpl::RemoveTaskTimeObserver( | 1532 void RendererSchedulerImpl::RemoveTaskTimeObserver( |
1523 TaskTimeObserver* task_time_observer) { | 1533 TaskTimeObserver* task_time_observer) { |
1524 helper_.RemoveTaskTimeObserver(task_time_observer); | 1534 helper_.RemoveTaskTimeObserver(task_time_observer); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1590 case v8::PERFORMANCE_LOAD: | 1600 case v8::PERFORMANCE_LOAD: |
1591 return "load"; | 1601 return "load"; |
1592 default: | 1602 default: |
1593 NOTREACHED(); | 1603 NOTREACHED(); |
1594 return nullptr; | 1604 return nullptr; |
1595 } | 1605 } |
1596 } | 1606 } |
1597 | 1607 |
1598 } // namespace scheduler | 1608 } // namespace scheduler |
1599 } // namespace blink | 1609 } // namespace blink |
OLD | NEW |