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