 Chromium Code Reviews
 Chromium Code Reviews Issue 2778123003:
  [scheduler] Add WakeupBudgetPool.  (Closed)
    
  
    Issue 2778123003:
  [scheduler] Add WakeupBudgetPool.  (Closed) 
  | 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 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 | 
| OLD | NEW |