Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: First meaningful version Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698