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

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

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: Rebased & addressed comments from skyostil@ and alexclarke@ Created 3 years, 7 months 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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 timer_tasks_seem_expensive(false), 210 timer_tasks_seem_expensive(false),
211 touchstart_expected_soon(false), 211 touchstart_expected_soon(false),
212 have_seen_a_begin_main_frame(false), 212 have_seen_a_begin_main_frame(false),
213 have_reported_blocking_intervention_in_current_policy(false), 213 have_reported_blocking_intervention_in_current_policy(false),
214 have_reported_blocking_intervention_since_navigation(false), 214 have_reported_blocking_intervention_since_navigation(false),
215 has_visible_render_widget_with_touch_handler(false), 215 has_visible_render_widget_with_touch_handler(false),
216 begin_frame_not_expected_soon(false), 216 begin_frame_not_expected_soon(false),
217 in_idle_period_for_testing(false), 217 in_idle_period_for_testing(false),
218 use_virtual_time(false), 218 use_virtual_time(false),
219 is_audio_playing(false), 219 is_audio_playing(false),
220 rail_mode_observer(nullptr) { 220 rail_mode_observer(nullptr),
221 wake_up_budget_pool(nullptr) {
221 foreground_main_thread_load_tracker.Resume(now); 222 foreground_main_thread_load_tracker.Resume(now);
222 } 223 }
223 224
224 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} 225 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {}
225 226
226 RendererSchedulerImpl::AnyThread::AnyThread() 227 RendererSchedulerImpl::AnyThread::AnyThread()
227 : awaiting_touch_start_response(false), 228 : awaiting_touch_start_response(false),
228 in_idle_period(false), 229 in_idle_period(false),
229 begin_main_frame_on_critical_path(false), 230 begin_main_frame_on_critical_path(false),
230 last_gesture_was_compositor_driven(false), 231 last_gesture_was_compositor_driven(false),
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled); 325 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled);
325 loading_task_queue->SetQueuePriority( 326 loading_task_queue->SetQueuePriority(
326 GetMainThreadOnly().current_policy.loading_queue_policy.priority); 327 GetMainThreadOnly().current_policy.loading_queue_policy.priority);
327 if (GetMainThreadOnly() 328 if (GetMainThreadOnly()
328 .current_policy.loading_queue_policy.time_domain_type == 329 .current_policy.loading_queue_policy.time_domain_type ==
329 TimeDomainType::THROTTLED) { 330 TimeDomainType::THROTTLED) {
330 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); 331 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get());
331 } 332 }
332 loading_task_queue->AddTaskObserver( 333 loading_task_queue->AddTaskObserver(
333 &GetMainThreadOnly().loading_task_cost_estimator); 334 &GetMainThreadOnly().loading_task_cost_estimator);
335 AddQueueToWakeUpBudgetPool(loading_task_queue.get());
334 return loading_task_queue; 336 return loading_task_queue;
335 } 337 }
336 338
337 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( 339 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue(
338 TaskQueue::QueueType queue_type) { 340 TaskQueue::QueueType queue_type) {
339 helper_.CheckOnValidThread(); 341 helper_.CheckOnValidThread();
340 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. 342 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
341 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( 343 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue(
342 TaskQueue::Spec(queue_type) 344 TaskQueue::Spec(queue_type)
343 .SetShouldMonitorQuiescence(true) 345 .SetShouldMonitorQuiescence(true)
344 .SetShouldReportWhenExecutionBlocked(true) 346 .SetShouldReportWhenExecutionBlocked(true)
345 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 347 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
346 ? GetVirtualTimeDomain() 348 ? GetVirtualTimeDomain()
347 : nullptr))); 349 : nullptr)));
348 auto insert_result = timer_task_runners_.insert(std::make_pair( 350 auto insert_result = timer_task_runners_.insert(std::make_pair(
349 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); 351 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter()));
350 insert_result.first->second->SetQueueEnabled( 352 insert_result.first->second->SetQueueEnabled(
351 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled); 353 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled);
352 timer_task_queue->SetQueuePriority( 354 timer_task_queue->SetQueuePriority(
353 GetMainThreadOnly().current_policy.timer_queue_policy.priority); 355 GetMainThreadOnly().current_policy.timer_queue_policy.priority);
354 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type == 356 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type ==
355 TimeDomainType::THROTTLED) { 357 TimeDomainType::THROTTLED) {
356 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); 358 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get());
357 } 359 }
358 timer_task_queue->AddTaskObserver( 360 timer_task_queue->AddTaskObserver(
359 &GetMainThreadOnly().timer_task_cost_estimator); 361 &GetMainThreadOnly().timer_task_cost_estimator);
362 AddQueueToWakeUpBudgetPool(timer_task_queue.get());
360 return timer_task_queue; 363 return timer_task_queue;
361 } 364 }
362 365
363 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue( 366 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue(
364 TaskQueue::QueueType queue_type) { 367 TaskQueue::QueueType queue_type) {
365 helper_.CheckOnValidThread(); 368 helper_.CheckOnValidThread();
366 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( 369 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
367 TaskQueue::Spec(queue_type) 370 TaskQueue::Spec(queue_type)
368 .SetShouldMonitorQuiescence(true) 371 .SetShouldMonitorQuiescence(true)
369 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 372 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
1342 1345
1343 TaskCostEstimator* 1346 TaskCostEstimator*
1344 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { 1347 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() {
1345 return &GetMainThreadOnly().timer_task_cost_estimator; 1348 return &GetMainThreadOnly().timer_task_cost_estimator;
1346 } 1349 }
1347 1350
1348 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() { 1351 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() {
1349 return &GetMainThreadOnly().idle_time_estimator; 1352 return &GetMainThreadOnly().idle_time_estimator;
1350 } 1353 }
1351 1354
1355 WakeUpBudgetPool* RendererSchedulerImpl::GetWakeUpBudgetPoolForTesting() {
1356 return GetMainThreadOnly().wake_up_budget_pool;
1357 }
1358
1352 void RendererSchedulerImpl::SuspendTimerQueue() { 1359 void RendererSchedulerImpl::SuspendTimerQueue() {
1353 GetMainThreadOnly().timer_queue_suspend_count++; 1360 GetMainThreadOnly().timer_queue_suspend_count++;
1354 ForceUpdatePolicy(); 1361 ForceUpdatePolicy();
1355 #ifndef NDEBUG 1362 #ifndef NDEBUG
1356 DCHECK(!default_timer_task_queue_->IsQueueEnabled()); 1363 DCHECK(!default_timer_task_queue_->IsQueueEnabled());
1357 for (const auto& runner : timer_task_runners_) { 1364 for (const auto& runner : timer_task_runners_) {
1358 DCHECK(!runner.first->IsQueueEnabled()); 1365 DCHECK(!runner.first->IsQueueEnabled());
1359 } 1366 }
1360 #endif 1367 #endif
1361 } 1368 }
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
1871 return false; 1878 return false;
1872 1879
1873 if (GetMainThreadOnly().is_audio_playing) 1880 if (GetMainThreadOnly().is_audio_playing)
1874 return true; 1881 return true;
1875 1882
1876 return GetMainThreadOnly().last_audio_state_change.value() + 1883 return GetMainThreadOnly().last_audio_state_change.value() +
1877 kThrottlingDelayAfterAudioIsPlayed > 1884 kThrottlingDelayAfterAudioIsPlayed >
1878 now; 1885 now;
1879 } 1886 }
1880 1887
1888 void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) {
1889 if (!GetMainThreadOnly().wake_up_budget_pool) {
1890 GetMainThreadOnly().wake_up_budget_pool =
1891 task_queue_throttler()->CreateWakeUpBudgetPool("renderer-wake-up-pool");
Sami 2017/05/03 16:53:05 uber-nit: let's use underscores instead of hyphens
altimin 2017/05/04 10:50:06 Done.
1892 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpRate(1);
1893 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpDuration(
1894 base::TimeDelta());
1895 }
1896 GetMainThreadOnly().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(),
1897 queue);
1898 }
1899
1881 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { 1900 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() {
1882 if (GetMainThreadOnly().use_virtual_time) { 1901 if (GetMainThreadOnly().use_virtual_time) {
1883 return GetVirtualTimeDomain(); 1902 return GetVirtualTimeDomain();
1884 } else { 1903 } else {
1885 return real_time_domain(); 1904 return real_time_domain();
1886 } 1905 }
1887 } 1906 }
1888 1907
1889 void RendererSchedulerImpl::OnTraceLogEnabled() { 1908 void RendererSchedulerImpl::OnTraceLogEnabled() {
1890 CreateTraceEventObjectSnapshot(); 1909 CreateTraceEventObjectSnapshot();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1943 case TimeDomainType::VIRTUAL: 1962 case TimeDomainType::VIRTUAL:
1944 return "virtual"; 1963 return "virtual";
1945 default: 1964 default:
1946 NOTREACHED(); 1965 NOTREACHED();
1947 return nullptr; 1966 return nullptr;
1948 } 1967 }
1949 } 1968 }
1950 1969
1951 } // namespace scheduler 1970 } // namespace scheduler
1952 } // namespace blink 1971 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698