| 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/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} | 95 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} |
| 96 | 96 |
| 97 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly() | 97 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly() |
| 98 : loading_task_cost_estimator(kLoadingTaskEstimationSampleCount, | 98 : loading_task_cost_estimator(kLoadingTaskEstimationSampleCount, |
| 99 kLoadingTaskEstimationPercentile), | 99 kLoadingTaskEstimationPercentile), |
| 100 timer_task_cost_estimator(kTimerTaskEstimationSampleCount, | 100 timer_task_cost_estimator(kTimerTaskEstimationSampleCount, |
| 101 kTimerTaskEstimationPercentile), | 101 kTimerTaskEstimationPercentile), |
| 102 short_idle_period_duration(kShortIdlePeriodDurationSampleCount), | 102 short_idle_period_duration(kShortIdlePeriodDurationSampleCount), |
| 103 current_use_case(UseCase::NONE), | 103 current_use_case(UseCase::NONE), |
| 104 timer_queue_suspend_count(0), | 104 timer_queue_suspend_count(0), |
| 105 navigation_task_expected_count(0), |
| 105 renderer_hidden(false), | 106 renderer_hidden(false), |
| 106 renderer_backgrounded(false), | 107 renderer_backgrounded(false), |
| 107 timer_queue_suspension_when_backgrounded_enabled(false), | 108 timer_queue_suspension_when_backgrounded_enabled(false), |
| 108 timer_queue_suspended_when_backgrounded(false), | 109 timer_queue_suspended_when_backgrounded(false), |
| 109 was_shutdown(false), | 110 was_shutdown(false), |
| 110 loading_tasks_seem_expensive(false), | 111 loading_tasks_seem_expensive(false), |
| 111 timer_tasks_seem_expensive(false), | 112 timer_tasks_seem_expensive(false), |
| 112 touchstart_expected_soon(false), | 113 touchstart_expected_soon(false), |
| 113 have_seen_a_begin_main_frame(false) {} | 114 have_seen_a_begin_main_frame(false) {} |
| 114 | 115 |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 break; | 625 break; |
| 625 | 626 |
| 626 default: | 627 default: |
| 627 NOTREACHED(); | 628 NOTREACHED(); |
| 628 } | 629 } |
| 629 | 630 |
| 630 // Don't block expensive tasks unless we have actually seen something. | 631 // Don't block expensive tasks unless we have actually seen something. |
| 631 if (!MainThreadOnly().have_seen_a_begin_main_frame) | 632 if (!MainThreadOnly().have_seen_a_begin_main_frame) |
| 632 block_expensive_tasks = false; | 633 block_expensive_tasks = false; |
| 633 | 634 |
| 635 // Don't block expensive tasks if we are expecting a navigation. |
| 636 if (MainThreadOnly().navigation_task_expected_count > 0) |
| 637 block_expensive_tasks = false; |
| 638 |
| 634 if (block_expensive_tasks && loading_tasks_seem_expensive) | 639 if (block_expensive_tasks && loading_tasks_seem_expensive) |
| 635 new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY; | 640 new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY; |
| 636 | 641 |
| 637 if ((block_expensive_tasks && timer_tasks_seem_expensive) || | 642 if ((block_expensive_tasks && timer_tasks_seem_expensive) || |
| 638 MainThreadOnly().timer_queue_suspend_count != 0 || | 643 MainThreadOnly().timer_queue_suspend_count != 0 || |
| 639 MainThreadOnly().timer_queue_suspended_when_backgrounded) { | 644 MainThreadOnly().timer_queue_suspended_when_backgrounded) { |
| 640 new_policy.timer_queue_priority = TaskQueue::DISABLED_PRIORITY; | 645 new_policy.timer_queue_priority = TaskQueue::DISABLED_PRIORITY; |
| 641 } | 646 } |
| 642 | 647 |
| 643 // Tracing is done before the early out check, because it's quite possible we | 648 // Tracing is done before the early out check, because it's quite possible we |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 MainThreadOnly().renderer_backgrounded); | 814 MainThreadOnly().renderer_backgrounded); |
| 810 state->SetBoolean("timer_queue_suspended_when_backgrounded", | 815 state->SetBoolean("timer_queue_suspended_when_backgrounded", |
| 811 MainThreadOnly().timer_queue_suspended_when_backgrounded); | 816 MainThreadOnly().timer_queue_suspended_when_backgrounded); |
| 812 state->SetInteger("timer_queue_suspend_count", | 817 state->SetInteger("timer_queue_suspend_count", |
| 813 MainThreadOnly().timer_queue_suspend_count); | 818 MainThreadOnly().timer_queue_suspend_count); |
| 814 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); | 819 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); |
| 815 state->SetDouble( | 820 state->SetDouble( |
| 816 "rails_loading_priority_deadline", | 821 "rails_loading_priority_deadline", |
| 817 (AnyThread().rails_loading_priority_deadline - base::TimeTicks()) | 822 (AnyThread().rails_loading_priority_deadline - base::TimeTicks()) |
| 818 .InMillisecondsF()); | 823 .InMillisecondsF()); |
| 824 state->SetInteger("navigation_task_expected_count", |
| 825 MainThreadOnly().navigation_task_expected_count); |
| 819 state->SetDouble("last_idle_period_end_time", | 826 state->SetDouble("last_idle_period_end_time", |
| 820 (AnyThread().last_idle_period_end_time - base::TimeTicks()) | 827 (AnyThread().last_idle_period_end_time - base::TimeTicks()) |
| 821 .InMillisecondsF()); | 828 .InMillisecondsF()); |
| 822 state->SetBoolean("awaiting_touch_start_response", | 829 state->SetBoolean("awaiting_touch_start_response", |
| 823 AnyThread().awaiting_touch_start_response); | 830 AnyThread().awaiting_touch_start_response); |
| 824 state->SetBoolean("begin_main_frame_on_critical_path", | 831 state->SetBoolean("begin_main_frame_on_critical_path", |
| 825 AnyThread().begin_main_frame_on_critical_path); | 832 AnyThread().begin_main_frame_on_critical_path); |
| 826 state->SetDouble("expected_loading_task_duration", | 833 state->SetDouble("expected_loading_task_duration", |
| 827 MainThreadOnly() | 834 MainThreadOnly() |
| 828 .loading_task_cost_estimator.expected_task_duration() | 835 .loading_task_cost_estimator.expected_task_duration() |
| (...skipping 22 matching lines...) Expand all Loading... |
| 851 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 858 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 852 } | 859 } |
| 853 | 860 |
| 854 void RendererSchedulerImpl::OnIdlePeriodEnded() { | 861 void RendererSchedulerImpl::OnIdlePeriodEnded() { |
| 855 base::AutoLock lock(any_thread_lock_); | 862 base::AutoLock lock(any_thread_lock_); |
| 856 AnyThread().last_idle_period_end_time = helper_.Now(); | 863 AnyThread().last_idle_period_end_time = helper_.Now(); |
| 857 AnyThread().in_idle_period = false; | 864 AnyThread().in_idle_period = false; |
| 858 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 865 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 859 } | 866 } |
| 860 | 867 |
| 861 void RendererSchedulerImpl::OnPageLoadStarted() { | 868 void RendererSchedulerImpl::NavigationTaskPendingIncRef() { |
| 869 helper_.CheckOnValidThread(); |
| 870 MainThreadOnly().navigation_task_expected_count++; |
| 871 UpdatePolicy(); |
| 872 } |
| 873 |
| 874 void RendererSchedulerImpl::NavigationTaskPendingDecRef() { |
| 875 helper_.CheckOnValidThread(); |
| 876 DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0); |
| 877 if (MainThreadOnly().navigation_task_expected_count > 0) |
| 878 MainThreadOnly().navigation_task_expected_count--; |
| 879 UpdatePolicy(); |
| 880 } |
| 881 |
| 882 void RendererSchedulerImpl::OnNavigationStarted() { |
| 862 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 883 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 863 "RendererSchedulerImpl::OnPageLoadStarted"); | 884 "RendererSchedulerImpl::OnNavigationStarted"); |
| 864 base::AutoLock lock(any_thread_lock_); | 885 base::AutoLock lock(any_thread_lock_); |
| 865 AnyThread().rails_loading_priority_deadline = | 886 AnyThread().rails_loading_priority_deadline = |
| 866 helper_.Now() + base::TimeDelta::FromMilliseconds( | 887 helper_.Now() + base::TimeDelta::FromMilliseconds( |
| 867 kRailsInitialLoadingPrioritizationMillis); | 888 kRailsInitialLoadingPrioritizationMillis); |
| 868 ResetForNavigationLocked(); | 889 ResetForNavigationLocked(); |
| 869 } | 890 } |
| 870 | 891 |
| 871 bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const { | 892 bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const { |
| 872 return (now - AnyThread().last_idle_period_end_time) <= | 893 return (now - AnyThread().last_idle_period_end_time) <= |
| 873 base::TimeDelta::FromMilliseconds( | 894 base::TimeDelta::FromMilliseconds( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 900 MainThreadOnly().short_idle_period_duration.Clear(); | 921 MainThreadOnly().short_idle_period_duration.Clear(); |
| 901 // Make sure that we don't initially assume there is no idle time. | 922 // Make sure that we don't initially assume there is no idle time. |
| 902 MainThreadOnly().short_idle_period_duration.InsertSample( | 923 MainThreadOnly().short_idle_period_duration.InsertSample( |
| 903 cc::BeginFrameArgs::DefaultInterval()); | 924 cc::BeginFrameArgs::DefaultInterval()); |
| 904 AnyThread().user_model.Reset(); | 925 AnyThread().user_model.Reset(); |
| 905 MainThreadOnly().have_seen_a_begin_main_frame = false; | 926 MainThreadOnly().have_seen_a_begin_main_frame = false; |
| 906 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 927 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
| 907 } | 928 } |
| 908 | 929 |
| 909 } // namespace scheduler | 930 } // namespace scheduler |
| OLD | NEW |