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 |