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

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1424053002: Adds a flag to support "Virtual Time" to the blink scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Helps if I upload the right files ;) Created 5 years, 1 month 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 "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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698