Chromium Code Reviews| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 // Amount of idle time left in a frame (as a ratio of the vsync interval) above | 43 // Amount of idle time left in a frame (as a ratio of the vsync interval) above |
| 44 // which main thread compositing can be considered fast. | 44 // which main thread compositing can be considered fast. |
| 45 const double kFastCompositingIdleTimeThreshold = .2; | 45 const double kFastCompositingIdleTimeThreshold = .2; |
| 46 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = | 46 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = |
| 47 base::TimeDelta::FromMinutes(1); | 47 base::TimeDelta::FromMinutes(1); |
| 48 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = | 48 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = |
| 49 base::TimeDelta::FromMinutes(2); | 49 base::TimeDelta::FromMinutes(2); |
| 50 // We do not throttle anything while audio is played and shortly after that. | 50 // We do not throttle anything while audio is played and shortly after that. |
| 51 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = | 51 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = |
| 52 base::TimeDelta::FromSeconds(5); | 52 base::TimeDelta::FromSeconds(5); |
| 53 constexpr base::TimeDelta kQueueingTimeWindowDuration = | |
| 54 base::TimeDelta::FromSeconds(1); | |
| 53 | 55 |
| 54 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { | 56 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
| 55 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) | 57 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) |
| 56 return; | 58 return; |
| 57 | 59 |
| 58 int load_percentage = static_cast<int>(load * 100); | 60 int load_percentage = static_cast<int>(load * 100); |
| 59 DCHECK_LE(load_percentage, 100); | 61 DCHECK_LE(load_percentage, 100); |
| 60 | 62 |
| 61 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", | 63 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", |
| 62 load_percentage); | 64 load_percentage); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 compositor_task_queue_( | 101 compositor_task_queue_( |
| 100 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) | 102 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) |
| 101 .SetShouldMonitorQuiescence(true))), | 103 .SetShouldMonitorQuiescence(true))), |
| 102 compositor_task_queue_enabled_voter_( | 104 compositor_task_queue_enabled_voter_( |
| 103 compositor_task_queue_->CreateQueueEnabledVoter()), | 105 compositor_task_queue_->CreateQueueEnabledVoter()), |
| 104 delayed_update_policy_runner_( | 106 delayed_update_policy_runner_( |
| 105 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 107 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 106 base::Unretained(this)), | 108 base::Unretained(this)), |
| 107 helper_.ControlTaskQueue()), | 109 helper_.ControlTaskQueue()), |
| 108 seqlock_queueing_time_estimator_( | 110 seqlock_queueing_time_estimator_( |
| 109 QueueingTimeEstimator(this, base::TimeDelta::FromSeconds(1))), | 111 QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)), |
| 110 main_thread_only_(this, | 112 main_thread_only_(this, |
| 111 compositor_task_queue_, | 113 compositor_task_queue_, |
| 112 helper_.scheduler_tqm_delegate().get(), | 114 helper_.scheduler_tqm_delegate().get(), |
| 113 helper_.scheduler_tqm_delegate()->NowTicks()), | 115 helper_.scheduler_tqm_delegate()->NowTicks()), |
| 114 policy_may_need_update_(&any_thread_lock_), | 116 policy_may_need_update_(&any_thread_lock_), |
| 115 weak_factory_(this) { | 117 weak_factory_(this) { |
| 116 task_queue_throttler_.reset(new TaskQueueThrottler(this)); | 118 task_queue_throttler_.reset(new TaskQueueThrottler(this)); |
| 117 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 119 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 118 weak_factory_.GetWeakPtr()); | 120 weak_factory_.GetWeakPtr()); |
| 119 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 121 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
| (...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1663 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { | 1665 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { |
| 1664 GetMainThreadOnly().rail_mode_observer = observer; | 1666 GetMainThreadOnly().rail_mode_observer = observer; |
| 1665 } | 1667 } |
| 1666 | 1668 |
| 1667 bool RendererSchedulerImpl::MainThreadSeemsUnresponsive( | 1669 bool RendererSchedulerImpl::MainThreadSeemsUnresponsive( |
| 1668 base::TimeDelta main_thread_responsiveness_threshold) { | 1670 base::TimeDelta main_thread_responsiveness_threshold) { |
| 1669 base::TimeTicks now = tick_clock()->NowTicks(); | 1671 base::TimeTicks now = tick_clock()->NowTicks(); |
| 1670 base::TimeDelta estimated_queueing_time; | 1672 base::TimeDelta estimated_queueing_time; |
| 1671 | 1673 |
| 1672 bool can_read = false; | 1674 bool can_read = false; |
| 1673 QueueingTimeEstimator::State queueing_time_estimator_state; | |
| 1674 | 1675 |
| 1675 base::subtle::Atomic32 version; | 1676 base::subtle::Atomic32 version; |
| 1676 seqlock_queueing_time_estimator_.seqlock.TryRead(&can_read, &version); | 1677 seqlock_queueing_time_estimator_.seqlock.TryRead(&can_read, &version); |
| 1677 | 1678 |
| 1678 // If we fail to determine if the main thread is busy, assume whether or not | 1679 // If we fail to determine if the main thread is busy, assume whether or not |
| 1679 // it's busy hasn't change since the last time we asked. | 1680 // it's busy hasn't change since the last time we asked. |
| 1680 if (!can_read) | 1681 if (!can_read) |
| 1681 return GetCompositorThreadOnly().main_thread_seems_unresponsive; | 1682 return GetCompositorThreadOnly().main_thread_seems_unresponsive; |
| 1682 | 1683 |
| 1683 queueing_time_estimator_state = | 1684 QueueingTimeEstimator::State queueing_time_estimator_state = |
| 1684 seqlock_queueing_time_estimator_.data.GetState(); | 1685 seqlock_queueing_time_estimator_.data.GetState(); |
| 1685 | 1686 |
| 1686 // If we fail to determine if the main thread is busy, assume whether or not | 1687 // If we fail to determine if the main thread is busy, assume whether or not |
| 1687 // it's busy hasn't change since the last time we asked. | 1688 // it's busy hasn't change since the last time we asked. |
| 1688 if (seqlock_queueing_time_estimator_.seqlock.ReadRetry(version)) | 1689 if (seqlock_queueing_time_estimator_.seqlock.ReadRetry(version)) |
| 1689 return GetCompositorThreadOnly().main_thread_seems_unresponsive; | 1690 return GetCompositorThreadOnly().main_thread_seems_unresponsive; |
| 1690 | 1691 |
| 1691 QueueingTimeEstimator queueing_time_estimator(queueing_time_estimator_state); | 1692 QueueingTimeEstimator queueing_time_estimator(queueing_time_estimator_state); |
| 1692 | 1693 |
| 1693 estimated_queueing_time = | 1694 estimated_queueing_time = |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1824 TaskTimeObserver* task_time_observer) { | 1825 TaskTimeObserver* task_time_observer) { |
| 1825 helper_.AddTaskTimeObserver(task_time_observer); | 1826 helper_.AddTaskTimeObserver(task_time_observer); |
| 1826 } | 1827 } |
| 1827 | 1828 |
| 1828 void RendererSchedulerImpl::RemoveTaskTimeObserver( | 1829 void RendererSchedulerImpl::RemoveTaskTimeObserver( |
| 1829 TaskTimeObserver* task_time_observer) { | 1830 TaskTimeObserver* task_time_observer) { |
| 1830 helper_.RemoveTaskTimeObserver(task_time_observer); | 1831 helper_.RemoveTaskTimeObserver(task_time_observer); |
| 1831 } | 1832 } |
| 1832 | 1833 |
| 1833 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( | 1834 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( |
| 1834 base::TimeDelta queueing_time) { | 1835 base::TimeDelta queueing_time, |
| 1836 base::TimeTicks window_start_time) { | |
| 1837 // RendererScheduler reports the queueing time once per window's duration. | |
| 1838 // |stepEQT|stepEQT|stepEQT|stepEQT|stepEQT|stepEQT| | |
| 1839 // Report: |-------window EQT------| | |
| 1840 // Discard: |-------window EQT------| | |
| 1841 // Discard: |-------window EQT------| | |
| 1842 // Report: |-------window EQT------| | |
| 1843 if (window_start_time - this->uma_last_report_window_start_time_ < | |
|
tdresser
2017/05/11 13:52:45
this->uma_last_report_window_start_time_ -> uma_la
Liquan (Max) Gu
2017/05/11 15:14:13
Right.
| |
| 1844 kQueueingTimeWindowDuration) { | |
| 1845 return; | |
| 1846 } | |
| 1835 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", | 1847 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", |
| 1836 queueing_time); | 1848 queueing_time); |
| 1837 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 1849 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 1838 "estimated_queueing_time_for_window", | 1850 "estimated_queueing_time_for_window", |
| 1839 queueing_time.InMillisecondsF()); | 1851 queueing_time.InMillisecondsF()); |
| 1852 this->uma_last_report_window_start_time_ = window_start_time; | |
| 1840 } | 1853 } |
| 1841 | 1854 |
| 1842 AutoAdvancingVirtualTimeDomain* RendererSchedulerImpl::GetVirtualTimeDomain() { | 1855 AutoAdvancingVirtualTimeDomain* RendererSchedulerImpl::GetVirtualTimeDomain() { |
| 1843 if (!virtual_time_domain_) { | 1856 if (!virtual_time_domain_) { |
| 1844 virtual_time_domain_.reset( | 1857 virtual_time_domain_.reset( |
| 1845 new AutoAdvancingVirtualTimeDomain(tick_clock()->NowTicks())); | 1858 new AutoAdvancingVirtualTimeDomain(tick_clock()->NowTicks())); |
| 1846 RegisterTimeDomain(virtual_time_domain_.get()); | 1859 RegisterTimeDomain(virtual_time_domain_.get()); |
| 1847 } | 1860 } |
| 1848 return virtual_time_domain_.get(); | 1861 return virtual_time_domain_.get(); |
| 1849 } | 1862 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1957 case TimeDomainType::VIRTUAL: | 1970 case TimeDomainType::VIRTUAL: |
| 1958 return "virtual"; | 1971 return "virtual"; |
| 1959 default: | 1972 default: |
| 1960 NOTREACHED(); | 1973 NOTREACHED(); |
| 1961 return nullptr; | 1974 return nullptr; |
| 1962 } | 1975 } |
| 1963 } | 1976 } |
| 1964 | 1977 |
| 1965 } // namespace scheduler | 1978 } // namespace scheduler |
| 1966 } // namespace blink | 1979 } // namespace blink |
| OLD | NEW |