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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2437003002: [scheduler] Add type to scheduler::TaskQueue (Closed)
Patch Set: fix windows compilation Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/stack_trace.h" 8 #include "base/debug/stack_trace.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698