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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled); | 309 GetMainThreadOnly().current_policy.loading_queue_policy.is_enabled); |
309 loading_task_queue->SetQueuePriority( | 310 loading_task_queue->SetQueuePriority( |
310 GetMainThreadOnly().current_policy.loading_queue_policy.priority); | 311 GetMainThreadOnly().current_policy.loading_queue_policy.priority); |
311 if (GetMainThreadOnly() | 312 if (GetMainThreadOnly() |
312 .current_policy.loading_queue_policy.time_domain_type == | 313 .current_policy.loading_queue_policy.time_domain_type == |
313 TimeDomainType::THROTTLED) { | 314 TimeDomainType::THROTTLED) { |
314 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); | 315 task_queue_throttler_->IncreaseThrottleRefCount(loading_task_queue.get()); |
315 } | 316 } |
316 loading_task_queue->AddTaskObserver( | 317 loading_task_queue->AddTaskObserver( |
317 &GetMainThreadOnly().loading_task_cost_estimator); | 318 &GetMainThreadOnly().loading_task_cost_estimator); |
| 319 AddQueueToWakeupBudgetPool(loading_task_queue.get()); |
318 return loading_task_queue; | 320 return loading_task_queue; |
319 } | 321 } |
320 | 322 |
321 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( | 323 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( |
322 TaskQueue::QueueType queue_type) { | 324 TaskQueue::QueueType queue_type) { |
323 helper_.CheckOnValidThread(); | 325 helper_.CheckOnValidThread(); |
324 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. | 326 // TODO(alexclarke): Consider using ApplyTaskQueuePolicy() for brevity. |
325 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( | 327 scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( |
326 TaskQueue::Spec(queue_type) | 328 TaskQueue::Spec(queue_type) |
327 .SetShouldMonitorQuiescence(true) | 329 .SetShouldMonitorQuiescence(true) |
328 .SetShouldReportWhenExecutionBlocked(true) | 330 .SetShouldReportWhenExecutionBlocked(true) |
329 .SetTimeDomain(GetMainThreadOnly().use_virtual_time | 331 .SetTimeDomain(GetMainThreadOnly().use_virtual_time |
330 ? GetVirtualTimeDomain() | 332 ? GetVirtualTimeDomain() |
331 : nullptr))); | 333 : nullptr))); |
332 auto insert_result = timer_task_runners_.insert(std::make_pair( | 334 auto insert_result = timer_task_runners_.insert(std::make_pair( |
333 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); | 335 timer_task_queue, timer_task_queue->CreateQueueEnabledVoter())); |
334 insert_result.first->second->SetQueueEnabled( | 336 insert_result.first->second->SetQueueEnabled( |
335 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled); | 337 GetMainThreadOnly().current_policy.timer_queue_policy.is_enabled); |
336 timer_task_queue->SetQueuePriority( | 338 timer_task_queue->SetQueuePriority( |
337 GetMainThreadOnly().current_policy.timer_queue_policy.priority); | 339 GetMainThreadOnly().current_policy.timer_queue_policy.priority); |
338 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type == | 340 if (GetMainThreadOnly().current_policy.timer_queue_policy.time_domain_type == |
339 TimeDomainType::THROTTLED) { | 341 TimeDomainType::THROTTLED) { |
340 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); | 342 task_queue_throttler_->IncreaseThrottleRefCount(timer_task_queue.get()); |
341 } | 343 } |
342 timer_task_queue->AddTaskObserver( | 344 timer_task_queue->AddTaskObserver( |
343 &GetMainThreadOnly().timer_task_cost_estimator); | 345 &GetMainThreadOnly().timer_task_cost_estimator); |
| 346 AddQueueToWakeupBudgetPool(timer_task_queue.get()); |
344 return timer_task_queue; | 347 return timer_task_queue; |
345 } | 348 } |
346 | 349 |
347 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( | 350 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewUnthrottledTaskRunner( |
348 TaskQueue::QueueType queue_type) { | 351 TaskQueue::QueueType queue_type) { |
349 helper_.CheckOnValidThread(); | 352 helper_.CheckOnValidThread(); |
350 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( | 353 scoped_refptr<TaskQueue> unthrottled_task_queue(helper_.NewTaskQueue( |
351 TaskQueue::Spec(queue_type) | 354 TaskQueue::Spec(queue_type) |
352 .SetShouldMonitorQuiescence(true) | 355 .SetShouldMonitorQuiescence(true) |
353 .SetTimeDomain(GetMainThreadOnly().use_virtual_time | 356 .SetTimeDomain(GetMainThreadOnly().use_virtual_time |
(...skipping 1504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 return false; | 1861 return false; |
1859 | 1862 |
1860 if (GetMainThreadOnly().is_audio_playing) | 1863 if (GetMainThreadOnly().is_audio_playing) |
1861 return true; | 1864 return true; |
1862 | 1865 |
1863 return GetMainThreadOnly().last_audio_state_change.value() + | 1866 return GetMainThreadOnly().last_audio_state_change.value() + |
1864 kThrottlingDelayAfterAudioIsPlayed > | 1867 kThrottlingDelayAfterAudioIsPlayed > |
1865 now; | 1868 now; |
1866 } | 1869 } |
1867 | 1870 |
| 1871 void RendererSchedulerImpl::AddQueueToWakeupBudgetPool(TaskQueue* queue) { |
| 1872 if (!GetMainThreadOnly().wake_up_budget_pool) { |
| 1873 GetMainThreadOnly().wake_up_budget_pool = |
| 1874 task_queue_throttler()->CreateWakeupBudgetPool("renderer-wake-up-pool"); |
| 1875 // We intentionally set current wakeup time to 0 due to lazy initialization. |
| 1876 GetMainThreadOnly().wake_up_budget_pool->SetWakeupRate(base::TimeTicks(), |
| 1877 1); |
| 1878 GetMainThreadOnly().wake_up_budget_pool->SetWakeupDuration( |
| 1879 base::TimeTicks(), base::TimeDelta()); |
| 1880 } |
| 1881 GetMainThreadOnly().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(), |
| 1882 queue); |
| 1883 } |
| 1884 |
1868 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { | 1885 TimeDomain* RendererSchedulerImpl::GetActiveTimeDomain() { |
1869 if (GetMainThreadOnly().use_virtual_time) { | 1886 if (GetMainThreadOnly().use_virtual_time) { |
1870 return GetVirtualTimeDomain(); | 1887 return GetVirtualTimeDomain(); |
1871 } else { | 1888 } else { |
1872 return real_time_domain(); | 1889 return real_time_domain(); |
1873 } | 1890 } |
1874 } | 1891 } |
1875 | 1892 |
1876 void RendererSchedulerImpl::OnTraceLogEnabled() { | 1893 void RendererSchedulerImpl::OnTraceLogEnabled() { |
1877 CreateTraceEventObjectSnapshot(); | 1894 CreateTraceEventObjectSnapshot(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 case TimeDomainType::VIRTUAL: | 1947 case TimeDomainType::VIRTUAL: |
1931 return "virtual"; | 1948 return "virtual"; |
1932 default: | 1949 default: |
1933 NOTREACHED(); | 1950 NOTREACHED(); |
1934 return nullptr; | 1951 return nullptr; |
1935 } | 1952 } |
1936 } | 1953 } |
1937 | 1954 |
1938 } // namespace scheduler | 1955 } // namespace scheduler |
1939 } // namespace blink | 1956 } // namespace blink |
OLD | NEW |