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 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1879 return false; | 1886 return false; |
1880 | 1887 |
1881 if (GetMainThreadOnly().is_audio_playing) | 1888 if (GetMainThreadOnly().is_audio_playing) |
1882 return true; | 1889 return true; |
1883 | 1890 |
1884 return GetMainThreadOnly().last_audio_state_change.value() + | 1891 return GetMainThreadOnly().last_audio_state_change.value() + |
1885 kThrottlingDelayAfterAudioIsPlayed > | 1892 kThrottlingDelayAfterAudioIsPlayed > |
1886 now; | 1893 now; |
1887 } | 1894 } |
1888 | 1895 |
| 1896 void RendererSchedulerImpl::AddQueueToWakeUpBudgetPool(TaskQueue* queue) { |
| 1897 if (!GetMainThreadOnly().wake_up_budget_pool) { |
| 1898 GetMainThreadOnly().wake_up_budget_pool = |
| 1899 task_queue_throttler()->CreateWakeUpBudgetPool("renderer-wake-up-pool"); |
| 1900 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpRate(1); |
| 1901 GetMainThreadOnly().wake_up_budget_pool->SetWakeUpDuration( |
| 1902 base::TimeDelta()); |
| 1903 } |
| 1904 GetMainThreadOnly().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(), |
| 1905 queue); |
| 1906 } |
| 1907 |
1889 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { | 1908 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { |
1890 if (GetMainThreadOnly().use_virtual_time) { | 1909 if (GetMainThreadOnly().use_virtual_time) { |
1891 return GetVirtualTimeDomain(); | 1910 return GetVirtualTimeDomain(); |
1892 } else { | 1911 } else { |
1893 return real_time_domain(); | 1912 return real_time_domain(); |
1894 } | 1913 } |
1895 } | 1914 } |
1896 | 1915 |
1897 void RendererSchedulerImpl::OnTraceLogEnabled() { | 1916 void RendererSchedulerImpl::OnTraceLogEnabled() { |
1898 CreateTraceEventObjectSnapshot(); | 1917 CreateTraceEventObjectSnapshot(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1951 case TimeDomainType::VIRTUAL: | 1970 case TimeDomainType::VIRTUAL: |
1952 return "virtual"; | 1971 return "virtual"; |
1953 default: | 1972 default: |
1954 NOTREACHED(); | 1973 NOTREACHED(); |
1955 return nullptr; | 1974 return nullptr; |
1956 } | 1975 } |
1957 } | 1976 } |
1958 | 1977 |
1959 } // namespace scheduler | 1978 } // namespace scheduler |
1960 } // namespace blink | 1979 } // namespace blink |
OLD | NEW |