Chromium Code Reviews| 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 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |