| 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 "components/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "components/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/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 11 #include "base/trace_event/trace_event_argument.h" |
| 11 #include "cc/output/begin_frame_args.h" | 12 #include "cc/output/begin_frame_args.h" |
| 12 #include "components/scheduler/base/task_queue_impl.h" | 13 #include "components/scheduler/base/task_queue_impl.h" |
| 13 #include "components/scheduler/base/task_queue_selector.h" | 14 #include "components/scheduler/base/task_queue_selector.h" |
| 14 #include "components/scheduler/child/scheduler_task_runner_delegate.h" | 15 #include "components/scheduler/child/scheduler_task_runner_delegate.h" |
| 15 | 16 |
| 16 namespace scheduler { | 17 namespace scheduler { |
| 17 namespace { | 18 namespace { |
| 18 // The run time of loading tasks is strongly bimodal. The vast majority are | 19 // The run time of loading tasks is strongly bimodal. The vast majority are |
| 19 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 | 20 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 |
| 20 // second on a mobile device) so we take a very pesimistic view when estimating | 21 // second on a mobile device) so we take a very pesimistic view when estimating |
| 21 // the cost of loading tasks. | 22 // the cost of loading tasks. |
| 22 const int kLoadingTaskEstimationSampleCount = 1000; | 23 const int kLoadingTaskEstimationSampleCount = 1000; |
| 23 const double kLoadingTaskEstimationPercentile = 98; | 24 const double kLoadingTaskEstimationPercentile = 98; |
| 24 const int kTimerTaskEstimationSampleCount = 200; | 25 const int kTimerTaskEstimationSampleCount = 200; |
| 25 const double kTimerTaskEstimationPercentile = 90; | 26 const double kTimerTaskEstimationPercentile = 90; |
| 26 const int kShortIdlePeriodDurationSampleCount = 10; | 27 const int kShortIdlePeriodDurationSampleCount = 10; |
| 27 const double kShortIdlePeriodDurationPercentile = 50; | 28 const double kShortIdlePeriodDurationPercentile = 50; |
| 28 } | 29 } |
| 29 | 30 |
| 30 RendererSchedulerImpl::RendererSchedulerImpl( | 31 RendererSchedulerImpl::RendererSchedulerImpl( |
| 31 scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner) | 32 scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner, |
| 33 TimeSource time_source) |
| 32 : helper_(main_task_runner, | 34 : helper_(main_task_runner, |
| 33 "renderer.scheduler", | 35 "renderer.scheduler", |
| 34 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 36 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 35 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
| 36 idle_helper_(&helper_, | 38 idle_helper_(&helper_, |
| 37 this, | 39 this, |
| 38 "renderer.scheduler", | 40 "renderer.scheduler", |
| 39 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 41 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 40 "RendererSchedulerIdlePeriod", | 42 "RendererSchedulerIdlePeriod", |
| 41 base::TimeDelta()), | 43 base::TimeDelta()), |
| 42 render_widget_scheduler_signals_(this), | 44 render_widget_scheduler_signals_(this), |
| 43 control_task_runner_(helper_.ControlTaskRunner()), | 45 control_task_runner_(helper_.ControlTaskRunner()), |
| 44 compositor_task_runner_( | 46 compositor_task_runner_( |
| 45 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 47 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
| 46 .SetShouldMonitorQuiescence(true))), | 48 .SetShouldMonitorQuiescence(true))), |
| 47 delayed_update_policy_runner_( | 49 delayed_update_policy_runner_( |
| 48 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 50 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 49 base::Unretained(this)), | 51 base::Unretained(this)), |
| 50 helper_.ControlTaskRunner()), | 52 helper_.ControlTaskRunner()), |
| 51 main_thread_only_(compositor_task_runner_), | 53 time_source_(time_source), |
| 54 main_thread_only_(compositor_task_runner_, helper_.tick_clock()), |
| 52 policy_may_need_update_(&any_thread_lock_), | 55 policy_may_need_update_(&any_thread_lock_), |
| 53 weak_factory_(this) { | 56 weak_factory_(this) { |
| 54 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 57 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 55 weak_factory_.GetWeakPtr()); | 58 weak_factory_.GetWeakPtr()); |
| 56 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 59 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
| 57 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 60 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
| 58 | 61 |
| 59 suspend_timers_when_backgrounded_closure_.Reset( | 62 suspend_timers_when_backgrounded_closure_.Reset( |
| 60 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 63 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
| 61 weak_factory_.GetWeakPtr())); | 64 weak_factory_.GetWeakPtr())); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 90 DCHECK(MainThreadOnly().was_shutdown); | 93 DCHECK(MainThreadOnly().was_shutdown); |
| 91 } | 94 } |
| 92 | 95 |
| 93 RendererSchedulerImpl::Policy::Policy() | 96 RendererSchedulerImpl::Policy::Policy() |
| 94 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), | 97 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| 95 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), | 98 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| 96 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), | 99 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), |
| 97 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} | 100 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} |
| 98 | 101 |
| 99 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( | 102 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
| 100 const scoped_refptr<TaskQueue>& compositor_task_runner) | 103 const scoped_refptr<TaskQueue>& compositor_task_runner, |
| 101 : loading_task_cost_estimator(kLoadingTaskEstimationSampleCount, | 104 base::TickClock* time_source) |
| 105 : loading_task_cost_estimator(time_source, |
| 106 kLoadingTaskEstimationSampleCount, |
| 102 kLoadingTaskEstimationPercentile), | 107 kLoadingTaskEstimationPercentile), |
| 103 timer_task_cost_estimator(kTimerTaskEstimationSampleCount, | 108 timer_task_cost_estimator(time_source, |
| 109 kTimerTaskEstimationSampleCount, |
| 104 kTimerTaskEstimationPercentile), | 110 kTimerTaskEstimationPercentile), |
| 105 idle_time_estimator(compositor_task_runner, | 111 idle_time_estimator(compositor_task_runner, |
| 112 time_source, |
| 106 kShortIdlePeriodDurationSampleCount, | 113 kShortIdlePeriodDurationSampleCount, |
| 107 kShortIdlePeriodDurationPercentile), | 114 kShortIdlePeriodDurationPercentile), |
| 108 current_use_case(UseCase::NONE), | 115 current_use_case(UseCase::NONE), |
| 109 timer_queue_suspend_count(0), | 116 timer_queue_suspend_count(0), |
| 110 navigation_task_expected_count(0), | 117 navigation_task_expected_count(0), |
| 111 renderer_hidden(false), | 118 renderer_hidden(false), |
| 112 renderer_backgrounded(false), | 119 renderer_backgrounded(false), |
| 113 timer_queue_suspension_when_backgrounded_enabled(false), | 120 timer_queue_suspension_when_backgrounded_enabled(false), |
| 114 timer_queue_suspended_when_backgrounded(false), | 121 timer_queue_suspended_when_backgrounded(false), |
| 115 was_shutdown(false), | 122 was_shutdown(false), |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 } | 245 } |
| 239 } | 246 } |
| 240 | 247 |
| 241 void RendererSchedulerImpl::DidCommitFrameToCompositor() { | 248 void RendererSchedulerImpl::DidCommitFrameToCompositor() { |
| 242 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 249 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 243 "RendererSchedulerImpl::DidCommitFrameToCompositor"); | 250 "RendererSchedulerImpl::DidCommitFrameToCompositor"); |
| 244 helper_.CheckOnValidThread(); | 251 helper_.CheckOnValidThread(); |
| 245 if (helper_.IsShutdown()) | 252 if (helper_.IsShutdown()) |
| 246 return; | 253 return; |
| 247 | 254 |
| 248 base::TimeTicks now(helper_.Now()); | 255 base::TimeTicks now(helper_.tick_clock()->NowTicks()); |
| 249 if (now < MainThreadOnly().estimated_next_frame_begin) { | 256 if (now < MainThreadOnly().estimated_next_frame_begin) { |
| 250 // TODO(rmcilroy): Consider reducing the idle period based on the runtime of | 257 // TODO(rmcilroy): Consider reducing the idle period based on the runtime of |
| 251 // the next pending delayed tasks (as currently done in for long idle times) | 258 // the next pending delayed tasks (as currently done in for long idle times) |
| 252 idle_helper_.StartIdlePeriod( | 259 idle_helper_.StartIdlePeriod( |
| 253 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, now, | 260 IdleHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, now, |
| 254 MainThreadOnly().estimated_next_frame_begin); | 261 MainThreadOnly().estimated_next_frame_begin); |
| 255 } | 262 } |
| 256 | 263 |
| 257 MainThreadOnly().idle_time_estimator.DidCommitFrameToCompositor(); | 264 MainThreadOnly().idle_time_estimator.DidCommitFrameToCompositor(); |
| 258 } | 265 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 end_idle_when_hidden_delay); | 302 end_idle_when_hidden_delay); |
| 296 MainThreadOnly().renderer_hidden = true; | 303 MainThreadOnly().renderer_hidden = true; |
| 297 } else { | 304 } else { |
| 298 MainThreadOnly().renderer_hidden = false; | 305 MainThreadOnly().renderer_hidden = false; |
| 299 EndIdlePeriod(); | 306 EndIdlePeriod(); |
| 300 } | 307 } |
| 301 | 308 |
| 302 // TODO(alexclarke): Should we update policy here? | 309 // TODO(alexclarke): Should we update policy here? |
| 303 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 310 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
| 304 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 311 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| 305 this, AsValue(helper_.Now())); | 312 this, AsValue(helper_.tick_clock()->NowTicks())); |
| 306 } | 313 } |
| 307 | 314 |
| 308 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( | 315 void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( |
| 309 bool has_visible_render_widget_with_touch_handler) { | 316 bool has_visible_render_widget_with_touch_handler) { |
| 310 helper_.CheckOnValidThread(); | 317 helper_.CheckOnValidThread(); |
| 311 if (has_visible_render_widget_with_touch_handler == | 318 if (has_visible_render_widget_with_touch_handler == |
| 312 MainThreadOnly().has_visible_render_widget_with_touch_handler) | 319 MainThreadOnly().has_visible_render_widget_with_touch_handler) |
| 313 return; | 320 return; |
| 314 | 321 |
| 315 MainThreadOnly().has_visible_render_widget_with_touch_handler = | 322 MainThreadOnly().has_visible_render_widget_with_touch_handler = |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 "RendererSchedulerImpl::DidAnimateForInputOnCompositorThread"); | 402 "RendererSchedulerImpl::DidAnimateForInputOnCompositorThread"); |
| 396 UpdateForInputEventOnCompositorThread( | 403 UpdateForInputEventOnCompositorThread( |
| 397 blink::WebInputEvent::Undefined, | 404 blink::WebInputEvent::Undefined, |
| 398 InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 405 InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 399 } | 406 } |
| 400 | 407 |
| 401 void RendererSchedulerImpl::UpdateForInputEventOnCompositorThread( | 408 void RendererSchedulerImpl::UpdateForInputEventOnCompositorThread( |
| 402 blink::WebInputEvent::Type type, | 409 blink::WebInputEvent::Type type, |
| 403 InputEventState input_event_state) { | 410 InputEventState input_event_state) { |
| 404 base::AutoLock lock(any_thread_lock_); | 411 base::AutoLock lock(any_thread_lock_); |
| 405 base::TimeTicks now = helper_.Now(); | 412 base::TimeTicks now = helper_.tick_clock()->NowTicks(); |
| 406 | 413 |
| 407 // TODO(alexclarke): Move WebInputEventTraits where we can access it from here | 414 // TODO(alexclarke): Move WebInputEventTraits where we can access it from here |
| 408 // and record the name rather than the integer representation. | 415 // and record the name rather than the integer representation. |
| 409 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 416 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 410 "RendererSchedulerImpl::UpdateForInputEventOnCompositorThread", | 417 "RendererSchedulerImpl::UpdateForInputEventOnCompositorThread", |
| 411 "type", static_cast<int>(type), "input_event_state", | 418 "type", static_cast<int>(type), "input_event_state", |
| 412 InputEventStateToString(input_event_state)); | 419 InputEventStateToString(input_event_state)); |
| 413 | 420 |
| 414 bool gesture_already_in_progress = InputSignalsSuggestGestureInProgress(now); | 421 bool gesture_already_in_progress = InputSignalsSuggestGestureInProgress(now); |
| 415 bool was_awaiting_touch_start_response = | 422 bool was_awaiting_touch_start_response = |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 463 CompositorThreadOnly().last_input_type = type; | 470 CompositorThreadOnly().last_input_type = type; |
| 464 } | 471 } |
| 465 | 472 |
| 466 void RendererSchedulerImpl::DidHandleInputEventOnMainThread( | 473 void RendererSchedulerImpl::DidHandleInputEventOnMainThread( |
| 467 const blink::WebInputEvent& web_input_event) { | 474 const blink::WebInputEvent& web_input_event) { |
| 468 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 475 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 469 "RendererSchedulerImpl::DidHandleInputEventOnMainThread"); | 476 "RendererSchedulerImpl::DidHandleInputEventOnMainThread"); |
| 470 helper_.CheckOnValidThread(); | 477 helper_.CheckOnValidThread(); |
| 471 if (ShouldPrioritizeInputEvent(web_input_event)) { | 478 if (ShouldPrioritizeInputEvent(web_input_event)) { |
| 472 base::AutoLock lock(any_thread_lock_); | 479 base::AutoLock lock(any_thread_lock_); |
| 473 AnyThread().user_model.DidFinishProcessingInputEvent(helper_.Now()); | 480 AnyThread().user_model.DidFinishProcessingInputEvent( |
| 481 helper_.tick_clock()->NowTicks()); |
| 474 } | 482 } |
| 475 } | 483 } |
| 476 | 484 |
| 477 bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() { | 485 bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() { |
| 478 helper_.CheckOnValidThread(); | 486 helper_.CheckOnValidThread(); |
| 479 if (helper_.IsShutdown()) | 487 if (helper_.IsShutdown()) |
| 480 return false; | 488 return false; |
| 481 | 489 |
| 482 MaybeUpdatePolicy(); | 490 MaybeUpdatePolicy(); |
| 483 // The touchstart and main-thread gesture use cases indicate a strong | 491 // The touchstart and main-thread gesture use cases indicate a strong |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 base::AutoLock lock(any_thread_lock_); | 562 base::AutoLock lock(any_thread_lock_); |
| 555 UpdatePolicyLocked(UpdateType::FORCE_UPDATE); | 563 UpdatePolicyLocked(UpdateType::FORCE_UPDATE); |
| 556 } | 564 } |
| 557 | 565 |
| 558 void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { | 566 void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
| 559 helper_.CheckOnValidThread(); | 567 helper_.CheckOnValidThread(); |
| 560 any_thread_lock_.AssertAcquired(); | 568 any_thread_lock_.AssertAcquired(); |
| 561 if (helper_.IsShutdown()) | 569 if (helper_.IsShutdown()) |
| 562 return; | 570 return; |
| 563 | 571 |
| 564 base::TimeTicks now = helper_.Now(); | 572 base::TimeTicks now = helper_.tick_clock()->NowTicks(); |
| 565 policy_may_need_update_.SetWhileLocked(false); | 573 policy_may_need_update_.SetWhileLocked(false); |
| 566 | 574 |
| 567 base::TimeDelta expected_use_case_duration; | 575 base::TimeDelta expected_use_case_duration; |
| 568 UseCase use_case = ComputeCurrentUseCase(now, &expected_use_case_duration); | 576 UseCase use_case = ComputeCurrentUseCase(now, &expected_use_case_duration); |
| 569 MainThreadOnly().current_use_case = use_case; | 577 MainThreadOnly().current_use_case = use_case; |
| 570 | 578 |
| 571 base::TimeDelta touchstart_expected_flag_valid_for_duration; | 579 base::TimeDelta touchstart_expected_flag_valid_for_duration; |
| 572 bool touchstart_expected_soon = false; | 580 bool touchstart_expected_soon = false; |
| 573 if (MainThreadOnly().has_visible_render_widget_with_touch_handler) { | 581 if (MainThreadOnly().has_visible_render_widget_with_touch_handler) { |
| 574 touchstart_expected_soon = AnyThread().user_model.IsGestureExpectedSoon( | 582 touchstart_expected_soon = AnyThread().user_model.IsGestureExpectedSoon( |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 base::AutoLock lock(any_thread_lock_); | 821 base::AutoLock lock(any_thread_lock_); |
| 814 return AsValueLocked(optional_now); | 822 return AsValueLocked(optional_now); |
| 815 } | 823 } |
| 816 | 824 |
| 817 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 825 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
| 818 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { | 826 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
| 819 helper_.CheckOnValidThread(); | 827 helper_.CheckOnValidThread(); |
| 820 any_thread_lock_.AssertAcquired(); | 828 any_thread_lock_.AssertAcquired(); |
| 821 | 829 |
| 822 if (optional_now.is_null()) | 830 if (optional_now.is_null()) |
| 823 optional_now = helper_.Now(); | 831 optional_now = helper_.tick_clock()->NowTicks(); |
| 824 scoped_refptr<base::trace_event::TracedValue> state = | 832 scoped_refptr<base::trace_event::TracedValue> state = |
| 825 new base::trace_event::TracedValue(); | 833 new base::trace_event::TracedValue(); |
| 826 | 834 |
| 827 state->SetBoolean( | 835 state->SetBoolean( |
| 828 "has_visible_render_widget_with_touch_handler", | 836 "has_visible_render_widget_with_touch_handler", |
| 829 MainThreadOnly().has_visible_render_widget_with_touch_handler); | 837 MainThreadOnly().has_visible_render_widget_with_touch_handler); |
| 830 state->SetString("current_use_case", | 838 state->SetString("current_use_case", |
| 831 UseCaseToString(MainThreadOnly().current_use_case)); | 839 UseCaseToString(MainThreadOnly().current_use_case)); |
| 832 state->SetBoolean("loading_tasks_seem_expensive", | 840 state->SetBoolean("loading_tasks_seem_expensive", |
| 833 MainThreadOnly().loading_tasks_seem_expensive); | 841 MainThreadOnly().loading_tasks_seem_expensive); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 } | 893 } |
| 886 | 894 |
| 887 void RendererSchedulerImpl::OnIdlePeriodStarted() { | 895 void RendererSchedulerImpl::OnIdlePeriodStarted() { |
| 888 base::AutoLock lock(any_thread_lock_); | 896 base::AutoLock lock(any_thread_lock_); |
| 889 AnyThread().in_idle_period = true; | 897 AnyThread().in_idle_period = true; |
| 890 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 898 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 891 } | 899 } |
| 892 | 900 |
| 893 void RendererSchedulerImpl::OnIdlePeriodEnded() { | 901 void RendererSchedulerImpl::OnIdlePeriodEnded() { |
| 894 base::AutoLock lock(any_thread_lock_); | 902 base::AutoLock lock(any_thread_lock_); |
| 895 AnyThread().last_idle_period_end_time = helper_.Now(); | 903 AnyThread().last_idle_period_end_time = helper_.tick_clock()->NowTicks(); |
| 896 AnyThread().in_idle_period = false; | 904 AnyThread().in_idle_period = false; |
| 897 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 905 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 898 } | 906 } |
| 899 | 907 |
| 900 void RendererSchedulerImpl::AddPendingNavigation() { | 908 void RendererSchedulerImpl::AddPendingNavigation() { |
| 901 helper_.CheckOnValidThread(); | 909 helper_.CheckOnValidThread(); |
| 902 MainThreadOnly().navigation_task_expected_count++; | 910 MainThreadOnly().navigation_task_expected_count++; |
| 903 UpdatePolicy(); | 911 UpdatePolicy(); |
| 904 } | 912 } |
| 905 | 913 |
| 906 void RendererSchedulerImpl::RemovePendingNavigation() { | 914 void RendererSchedulerImpl::RemovePendingNavigation() { |
| 907 helper_.CheckOnValidThread(); | 915 helper_.CheckOnValidThread(); |
| 908 DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0); | 916 DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0); |
| 909 if (MainThreadOnly().navigation_task_expected_count > 0) | 917 if (MainThreadOnly().navigation_task_expected_count > 0) |
| 910 MainThreadOnly().navigation_task_expected_count--; | 918 MainThreadOnly().navigation_task_expected_count--; |
| 911 UpdatePolicy(); | 919 UpdatePolicy(); |
| 912 } | 920 } |
| 913 | 921 |
| 914 void RendererSchedulerImpl::OnNavigationStarted() { | 922 void RendererSchedulerImpl::OnNavigationStarted() { |
| 915 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 923 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 916 "RendererSchedulerImpl::OnNavigationStarted"); | 924 "RendererSchedulerImpl::OnNavigationStarted"); |
| 917 base::AutoLock lock(any_thread_lock_); | 925 base::AutoLock lock(any_thread_lock_); |
| 918 AnyThread().rails_loading_priority_deadline = | 926 AnyThread().rails_loading_priority_deadline = |
| 919 helper_.Now() + base::TimeDelta::FromMilliseconds( | 927 helper_.tick_clock()->NowTicks() + |
| 920 kRailsInitialLoadingPrioritizationMillis); | 928 base::TimeDelta::FromMilliseconds( |
| 929 kRailsInitialLoadingPrioritizationMillis); |
| 921 ResetForNavigationLocked(); | 930 ResetForNavigationLocked(); |
| 922 } | 931 } |
| 923 | 932 |
| 924 bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const { | 933 bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const { |
| 925 return (now - AnyThread().last_idle_period_end_time) <= | 934 return (now - AnyThread().last_idle_period_end_time) <= |
| 926 base::TimeDelta::FromMilliseconds( | 935 base::TimeDelta::FromMilliseconds( |
| 927 kIdlePeriodStarvationThresholdMillis); | 936 kIdlePeriodStarvationThresholdMillis); |
| 928 } | 937 } |
| 929 | 938 |
| 930 void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() { | 939 void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 944 MainThreadOnly().timer_queue_suspended_when_backgrounded = false; | 953 MainThreadOnly().timer_queue_suspended_when_backgrounded = false; |
| 945 ForceUpdatePolicy(); | 954 ForceUpdatePolicy(); |
| 946 } | 955 } |
| 947 | 956 |
| 948 void RendererSchedulerImpl::ResetForNavigationLocked() { | 957 void RendererSchedulerImpl::ResetForNavigationLocked() { |
| 949 helper_.CheckOnValidThread(); | 958 helper_.CheckOnValidThread(); |
| 950 any_thread_lock_.AssertAcquired(); | 959 any_thread_lock_.AssertAcquired(); |
| 951 MainThreadOnly().loading_task_cost_estimator.Clear(); | 960 MainThreadOnly().loading_task_cost_estimator.Clear(); |
| 952 MainThreadOnly().timer_task_cost_estimator.Clear(); | 961 MainThreadOnly().timer_task_cost_estimator.Clear(); |
| 953 MainThreadOnly().idle_time_estimator.Clear(); | 962 MainThreadOnly().idle_time_estimator.Clear(); |
| 954 AnyThread().user_model.Reset(helper_.Now()); | 963 AnyThread().user_model.Reset(helper_.tick_clock()->NowTicks()); |
| 955 MainThreadOnly().have_seen_a_begin_main_frame = false; | 964 MainThreadOnly().have_seen_a_begin_main_frame = false; |
| 956 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 965 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 957 } | 966 } |
| 958 | 967 |
| 968 double RendererSchedulerImpl::currentTime() const { |
| 969 switch (time_source_) { |
| 970 case TimeSource::NORMAL: |
| 971 return base::Time::Now().ToDoubleT(); |
| 972 |
| 973 case TimeSource::VIRTUAL: |
| 974 return (helper_.tick_clock()->NowTicks() - base::TimeTicks::UnixEpoch()) |
| 975 .InSecondsF(); |
| 976 |
| 977 default: |
| 978 break; |
| 979 } |
| 980 NOTREACHED(); |
| 981 return 0; |
| 982 } |
| 983 |
| 984 double RendererSchedulerImpl::monotonicallyIncreasingTime() const { |
| 985 return helper_.tick_clock()->NowTicks().ToInternalValue() / |
| 986 static_cast<double>(base::Time::kMicrosecondsPerSecond); |
| 987 } |
| 988 |
| 959 } // namespace scheduler | 989 } // namespace scheduler |
| OLD | NEW |