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

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

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: Addressed comments 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled); 330 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled);
330 loading_task_queue->SetQueuePriority( 331 loading_task_queue->SetQueuePriority(
331 GetMainThreadOnly().current_policy.loading_queue_policy.priority); 332 GetMainThreadOnly().current_policy.loading_queue_policy.priority);
332 if (GetMainThreadOnly() 333 if (GetMainThreadOnly()
333 .current_policy.loading_queue_policy.time_domain_type == 334 .current_policy.loading_queue_policy.time_domain_type ==
334 TimeDomainType::THROTTLED) { 335 TimeDomainType::THROTTLED) {
335 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); 336 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get());
336 } 337 }
337 loading_task_queue->AddTaskObserver( 338 loading_task_queue->AddTaskObserver(
338 &GetMainThreadOnly().loading_task_cost_estimator); 339 &GetMainThreadOnly().loading_task_cost_estimator);
340 AddQueueToWakeUpBudgetPool(loading_task_queue.get());
339 return loading_task_queue; 341 return loading_task_queue;
340 } 342 }
341 343
342 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue( 344 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskQueue(
343 TaskQueue::QueueType queue_type) { 345 TaskQueue::QueueType queue_type) {
344 helper_.CheckOnValidThread(); 346 helper_.CheckOnValidThread();
345 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. 347 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity.
346 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( 348 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue(
347 TaskQueue::Spec(queue_type) 349 TaskQueue::Spec(queue_type)
348 .SetShouldMonitorQuiescence(true) 350 .SetShouldMonitorQuiescence(true)
349 .SetShouldReportWhenExecutionBlocked(true) 351 .SetShouldReportWhenExecutionBlocked(true)
350 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 352 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
351 ? GetVirtualTimeDomain() 353 ? GetVirtualTimeDomain()
352 : nullptr))); 354 : nullptr)));
353 auto insert_result = timer_task_runners_.insert(std::make_pair( 355 auto insert_result = timer_task_runners_.insert(std::make_pair(
354 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); 356 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter()));
355 insert_result.first->second->SetQueueEnabled( 357 insert_result.first->second->SetQueueEnabled(
356 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled); 358 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled);
357 timer_task_queue->SetQueuePriority( 359 timer_task_queue->SetQueuePriority(
358 GetMainThreadOnly().current_policy.timer_queue_policy.priority); 360 GetMainThreadOnly().current_policy.timer_queue_policy.priority);
359 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type == 361 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type ==
360 TimeDomainType::THROTTLED) { 362 TimeDomainType::THROTTLED) {
361 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); 363 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get());
362 } 364 }
363 timer_task_queue->AddTaskObserver( 365 timer_task_queue->AddTaskObserver(
364 &GetMainThreadOnly().timer_task_cost_estimator); 366 &GetMainThreadOnly().timer_task_cost_estimator);
367 AddQueueToWakeUpBudgetPool(timer_task_queue.get());
365 return timer_task_queue; 368 return timer_task_queue;
366 } 369 }
367 370
368 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue( 371 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskQueue(
369 TaskQueue::QueueType queue_type) { 372 TaskQueue::QueueType queue_type) {
370 helper_.CheckOnValidThread(); 373 helper_.CheckOnValidThread();
371 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( 374 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue(
372 TaskQueue::Spec(queue_type) 375 TaskQueue::Spec(queue_type)
373 .SetShouldMonitorQuiescence(true) 376 .SetShouldMonitorQuiescence(true)
374 .SetTimeDomain(GetMainThreadOnly().use_virtual_time 377 .SetTimeDomain(GetMainThreadOnly().use_virtual_time
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 1350
1348 TaskCostEstimator* 1351 TaskCostEstimator*
1349 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { 1352 RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() {
1350 return &GetMainThreadOnly().timer_task_cost_estimator; 1353 return &GetMainThreadOnly().timer_task_cost_estimator;
1351 } 1354 }
1352 1355
1353 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() { 1356 IdleTimeEstimator* RendererSchedulerImpl::GetIdleTimeEstimatorForTesting() {
1354 return &GetMainThreadOnly().idle_time_estimator; 1357 return &GetMainThreadOnly().idle_time_estimator;
1355 } 1358 }
1356 1359
1360 WakeUpBudgetPool* RendererSchedulerImpl::GetWakeUpBudgetPoolForTesting() {
1361 return GetMainThreadOnly().wake_up_budget_pool;
1362 }
1363
1357 void RendererSchedulerImpl::SuspendTimerQueue() { 1364 void RendererSchedulerImpl::SuspendTimerQueue() {
1358 GetMainThreadOnly().timer_queue_suspend_count++; 1365 GetMainThreadOnly().timer_queue_suspend_count++;
1359 ForceUpdatePolicy(); 1366 ForceUpdatePolicy();
1360 #ifndef NDEBUG 1367 #ifndef NDEBUG
1361 DCHECK(!default_timer_task_queue_->IsQueueEnabled()); 1368 DCHECK(!default_timer_task_queue_->IsQueueEnabled());
1362 for (const auto& runner : timer_task_runners_) { 1369 for (const auto& runner : timer_task_runners_) {
1363 DCHECK(!runner.first->IsQueueEnabled()); 1370 DCHECK(!runner.first->IsQueueEnabled());
1364 } 1371 }
1365 #endif 1372 #endif
1366 } 1373 }
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 return false; 1892 return false;
1886 1893
1887 if (GetMainThreadOnly().is_audio_playing) 1894 if (GetMainThreadOnly().is_audio_playing)
1888 return true; 1895 return true;
1889 1896
1890 return GetMainThreadOnly().last_audio_state_change.value() + 1897 return GetMainThreadOnly().last_audio_state_change.value() +
1891 kThrottlingDelayAfterAudioIsPlayed > 1898 kThrottlingDelayAfterAudioIsPlayed >
1892 now; 1899 now;
1893 } 1900 }
1894 1901
1902 void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) {
1903 if (!GetMainThreadOnly().wake_up_budget_pool) {
1904 GetMainThreadOnly().wake_up_budget_pool =
1905 task_queue_throttler()->CreateWakeUpBudgetPool("renderer_wake_up_pool");
1906 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpRate(1);
1907 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpDuration(
1908 base::TimeDelta());
1909 }
1910 GetMainThreadOnly().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(),
1911 queue);
1912 }
1913
1895 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { 1914 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() {
1896 if (GetMainThreadOnly().use_virtual_time) { 1915 if (GetMainThreadOnly().use_virtual_time) {
1897 return GetVirtualTimeDomain(); 1916 return GetVirtualTimeDomain();
1898 } else { 1917 } else {
1899 return real_time_domain(); 1918 return real_time_domain();
1900 } 1919 }
1901 } 1920 }
1902 1921
1903 void RendererSchedulerImpl::OnTraceLogEnabled() { 1922 void RendererSchedulerImpl::OnTraceLogEnabled() {
1904 CreateTraceEventObjectSnapshot(); 1923 CreateTraceEventObjectSnapshot();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 case TimeDomainType::VIRTUAL: 1976 case TimeDomainType::VIRTUAL:
1958 return "virtual"; 1977 return "virtual";
1959 default: 1978 default:
1960 NOTREACHED(); 1979 NOTREACHED();
1961 return nullptr; 1980 return nullptr;
1962 } 1981 }
1963 } 1982 }
1964 1983
1965 } // namespace scheduler 1984 } // namespace scheduler
1966 } // namespace blink 1985 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698