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

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

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: Second iteration. 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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 timer_tasks_seem_expensive(false), 217 timer_tasks_seem_expensive(false),
218 touchstart_expected_soon(false), 218 touchstart_expected_soon(false),
219 have_seen_a_begin_main_frame(false), 219 have_seen_a_begin_main_frame(false),
220 have_reported_blocking_intervention_in_current_policy(false), 220 have_reported_blocking_intervention_in_current_policy(false),
221 have_reported_blocking_intervention_since_navigation(false), 221 have_reported_blocking_intervention_since_navigation(false),
222 has_visible_render_widget_with_touch_handler(false), 222 has_visible_render_widget_with_touch_handler(false),
223 begin_frame_not_expected_soon(false), 223 begin_frame_not_expected_soon(false),
224 in_idle_period_for_testing(false), 224 in_idle_period_for_testing(false),
225 use_virtual_time(false), 225 use_virtual_time(false),
226 is_audio_playing(false), 226 is_audio_playing(false),
227 rail_mode_observer(nullptr) { 227 rail_mode_observer(nullptr),
228 wake_up_budget_pool(nullptr) {
228 foreground_main_thread_load_tracker.Resume(now); 229 foreground_main_thread_load_tracker.Resume(now);
229 } 230 }
230 231
231 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} 232 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {}
232 233
233 RendererSchedulerImpl::AnyThread::AnyThread() 234 RendererSchedulerImpl::AnyThread::AnyThread()
234 : awaiting_touch_start_response(false), 235 : awaiting_touch_start_response(false),
235 in_idle_period(false), 236 in_idle_period(false),
236 begin_main_frame_on_critical_path(false), 237 begin_main_frame_on_critical_path(false),
237 last_gesture_was_compositor_driven(false), 238 last_gesture_was_compositor_driven(false),
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled); 332 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled);
332 loading_task_queue->SetQueuePriority( 333 loading_task_queue->SetQueuePriority(
333 GetMainThreadOnly().current_policy.loading_queue_policy.priority); 334 GetMainThreadOnly().current_policy.loading_queue_policy.priority);
334 if (GetMainThreadOnly() 335 if (GetMainThreadOnly()
335 .current_policy.loading_queue_policy.time_domain_type == 336 .current_policy.loading_queue_policy.time_domain_type ==
336 TimeDomainType::THROTTLED) { 337 TimeDomainType::THROTTLED) {
337 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); 338 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get());
338 } 339 }
339 loading_task_queue->AddTaskObserver( 340 loading_task_queue->AddTaskObserver(
340 &GetMainThreadOnly().loading_task_cost_estimator); 341 &GetMainThreadOnly().loading_task_cost_estimator);
342 AddQueueToWakeUpBudgetPool(loading_task_queue.get());
341 return loading_task_queue; 343 return loading_task_queue;
342 } 344 }
343 345
344 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( 346 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue(
345 TaskQueue::QueueType queue_type) { 347 TaskQueue::QueueType queue_type) {
346 helper_.CheckOnValidThread(); 348 helper_.CheckOnValidThread();
347 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. 349 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
348 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( 350 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue(
349 TaskQueue::Spec(queue_type) 351 TaskQueue::Spec(queue_type)
350 .SetShouldMonitorQuiescence(true) 352 .SetShouldMonitorQuiescence(true)
351 .SetShouldReportWhenExecutionBlocked(true) 353 .SetShouldReportWhenExecutionBlocked(true)
352 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 354 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
353 ? GetVirtualTimeDomain() 355 ? GetVirtualTimeDomain()
354 : nullptr))); 356 : nullptr)));
355 auto insert_result = timer_task_runners_.insert(std::make_pair( 357 auto insert_result = timer_task_runners_.insert(std::make_pair(
356 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); 358 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter()));
357 insert_result.first->second->SetQueueEnabled( 359 insert_result.first->second->SetQueueEnabled(
358 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled); 360 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled);
359 timer_task_queue->SetQueuePriority( 361 timer_task_queue->SetQueuePriority(
360 GetMainThreadOnly().current_policy.timer_queue_policy.priority); 362 GetMainThreadOnly().current_policy.timer_queue_policy.priority);
361 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type == 363 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type ==
362 TimeDomainType::THROTTLED) { 364 TimeDomainType::THROTTLED) {
363 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); 365 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get());
364 } 366 }
365 timer_task_queue->AddTaskObserver( 367 timer_task_queue->AddTaskObserver(
366 &GetMainThreadOnly().timer_task_cost_estimator); 368 &GetMainThreadOnly().timer_task_cost_estimator);
369 AddQueueToWakeUpBudgetPool(timer_task_queue.get());
367 return timer_task_queue; 370 return timer_task_queue;
368 } 371 }
369 372
370 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue( 373 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue(
371 TaskQueue::QueueType queue_type) { 374 TaskQueue::QueueType queue_type) {
372 helper_.CheckOnValidThread(); 375 helper_.CheckOnValidThread();
373 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( 376 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
374 TaskQueue::Spec(queue_type) 377 TaskQueue::Spec(queue_type)
375 .SetShouldMonitorQuiescence(true) 378 .SetShouldMonitorQuiescence(true)
376 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 379 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 1353
1351 TaskCostEstimator* 1354 TaskCostEstimator*
1352 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { 1355 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() {
1353 return &GetMainThreadOnly().timer_task_cost_estimator; 1356 return &GetMainThreadOnly().timer_task_cost_estimator;
1354 } 1357 }
1355 1358
1356 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() { 1359 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() {
1357 return &GetMainThreadOnly().idle_time_estimator; 1360 return &GetMainThreadOnly().idle_time_estimator;
1358 } 1361 }
1359 1362
1363 WakeUpBudgetPool* RendererSchedulerImpl::GetWakeUpBudgetPoolForTesting() {
1364 return GetMainThreadOnly().wake_up_budget_pool;
1365 }
1366
1360 void RendererSchedulerImpl::SuspendTimerQueue() { 1367 void RendererSchedulerImpl::SuspendTimerQueue() {
1361 GetMainThreadOnly().timer_queue_suspend_count++; 1368 GetMainThreadOnly().timer_queue_suspend_count++;
1362 ForceUpdatePolicy(); 1369 ForceUpdatePolicy();
1363 #ifndef NDEBUG 1370 #ifndef NDEBUG
1364 DCHECK(!default_timer_task_runner_->IsQueueEnabled()); 1371 DCHECK(!default_timer_task_runner_->IsQueueEnabled());
1365 for (const auto& runner : timer_task_runners_) { 1372 for (const auto& runner : timer_task_runners_) {
1366 DCHECK(!runner.first->IsQueueEnabled()); 1373 DCHECK(!runner.first->IsQueueEnabled());
1367 } 1374 }
1368 #endif 1375 #endif
1369 } 1376 }
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 return false; 1888 return false;
1882 1889
1883 if (GetMainThreadOnly().is_audio_playing) 1890 if (GetMainThreadOnly().is_audio_playing)
1884 return true; 1891 return true;
1885 1892
1886 return GetMainThreadOnly().last_audio_state_change.value() + 1893 return GetMainThreadOnly().last_audio_state_change.value() +
1887 kThrottlingDelayAfterAudioIsPlayed > 1894 kThrottlingDelayAfterAudioIsPlayed >
1888 now; 1895 now;
1889 } 1896 }
1890 1897
1898 void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) {
1899 if (!GetMainThreadOnly().wake_up_budget_pool) {
1900 GetMainThreadOnly().wake_up_budget_pool =
1901 task_queue_throttler()->CreateWakeUpBudgetPool("renderer-wake-up-pool");
alex clarke (OOO till 29th) 2017/04/26 13:31:55 I wonder if we should use a builder for WakeUpBudg
altimin 2017/04/26 14:31:29 I'd like to have an ability to change wakeup rate
1902 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpRate(1);
1903 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpDuration(
1904 base::TimeDelta());
1905 }
1906 GetMainThreadOnly().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(),
1907 queue);
1908 }
1909
1891 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { 1910 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() {
1892 if (GetMainThreadOnly().use_virtual_time) { 1911 if (GetMainThreadOnly().use_virtual_time) {
1893 return GetVirtualTimeDomain(); 1912 return GetVirtualTimeDomain();
1894 } else { 1913 } else {
1895 return real_time_domain(); 1914 return real_time_domain();
1896 } 1915 }
1897 } 1916 }
1898 1917
1899 void RendererSchedulerImpl::OnTraceLogEnabled() { 1918 void RendererSchedulerImpl::OnTraceLogEnabled() {
1900 CreateTraceEventObjectSnapshot(); 1919 CreateTraceEventObjectSnapshot();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 case TimeDomainType::VIRTUAL: 1972 case TimeDomainType::VIRTUAL:
1954 return "virtual"; 1973 return "virtual";
1955 default: 1974 default:
1956 NOTREACHED(); 1975 NOTREACHED();
1957 return nullptr; 1976 return nullptr;
1958 } 1977 }
1959 } 1978 }
1960 1979
1961 } // namespace scheduler 1980 } // namespace scheduler
1962 } // namespace blink 1981 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698