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 29 matching lines...) Expand all Loading... | |
| 40 // Amount of idle time left in a frame (as a ratio of the vsync interval) above | 40 // Amount of idle time left in a frame (as a ratio of the vsync interval) above |
| 41 // which main thread compositing can be considered fast. | 41 // which main thread compositing can be considered fast. |
| 42 const double kFastCompositingIdleTimeThreshold = .2; | 42 const double kFastCompositingIdleTimeThreshold = .2; |
| 43 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = | 43 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = |
| 44 base::TimeDelta::FromMinutes(1); | 44 base::TimeDelta::FromMinutes(1); |
| 45 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = | 45 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = |
| 46 base::TimeDelta::FromMinutes(2); | 46 base::TimeDelta::FromMinutes(2); |
| 47 // We do not throttle anything while audio is played and shortly after that. | 47 // We do not throttle anything while audio is played and shortly after that. |
| 48 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = | 48 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = |
| 49 base::TimeDelta::FromSeconds(5); | 49 base::TimeDelta::FromSeconds(5); |
| 50 // Maximum task queueing time before the main thread is considered unresponsive. | |
| 51 constexpr base::TimeDelta kMainThreadResponsivenessThreshold = | |
| 52 base::TimeDelta::FromMilliseconds(200); | |
| 50 | 53 |
| 51 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { | 54 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
| 52 int load_percentage = static_cast<int>(load * 100); | 55 int load_percentage = static_cast<int>(load * 100); |
| 53 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", | 56 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", |
| 54 load_percentage); | 57 load_percentage); |
| 55 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 58 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 56 "RendererScheduler.ForegroundRendererLoad", load_percentage); | 59 "RendererScheduler.ForegroundRendererLoad", load_percentage); |
| 57 } | 60 } |
| 58 | 61 |
| 59 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { | 62 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { |
| 60 int load_percentage = static_cast<int>(load * 100); | 63 int load_percentage = static_cast<int>(load * 100); |
| 61 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", | 64 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", |
| 62 load_percentage); | 65 load_percentage); |
| 63 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 66 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 64 "RendererScheduler.BackgroundRendererLoad", load_percentage); | 67 "RendererScheduler.BackgroundRendererLoad", load_percentage); |
| 65 } | 68 } |
| 66 | 69 |
| 67 base::TimeTicks MonotonicTimeInSecondsToTimeTicks( | 70 base::TimeTicks MonotonicTimeInSecondsToTimeTicks( |
| 68 double monotonicTimeInSeconds) { | 71 double monotonicTimeInSeconds) { |
| 69 return base::TimeTicks() + base::TimeDelta::FromSecondsD( | 72 return base::TimeTicks() + |
| 70 monotonicTimeInSeconds); | 73 base::TimeDelta::FromSecondsD(monotonicTimeInSeconds); |
| 71 } | 74 } |
| 72 | 75 |
| 73 std::string PointerToId(void* pointer) { | 76 std::string PointerToId(void* pointer) { |
| 74 return base::StringPrintf( | 77 return base::StringPrintf( |
| 75 "0x%" PRIx64, | 78 "0x%" PRIx64, |
| 76 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer))); | 79 static_cast<uint64_t>(reinterpret_cast<uintptr_t>(pointer))); |
| 77 } | 80 } |
| 78 | 81 |
| 79 } // namespace | 82 } // namespace |
| 80 | 83 |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 94 control_task_runner_(helper_.ControlTaskRunner()), | 97 control_task_runner_(helper_.ControlTaskRunner()), |
| 95 compositor_task_runner_( | 98 compositor_task_runner_( |
| 96 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) | 99 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) |
| 97 .SetShouldMonitorQuiescence(true))), | 100 .SetShouldMonitorQuiescence(true))), |
| 98 compositor_task_runner_enabled_voter_( | 101 compositor_task_runner_enabled_voter_( |
| 99 compositor_task_runner_->CreateQueueEnabledVoter()), | 102 compositor_task_runner_->CreateQueueEnabledVoter()), |
| 100 delayed_update_policy_runner_( | 103 delayed_update_policy_runner_( |
| 101 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 104 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 102 base::Unretained(this)), | 105 base::Unretained(this)), |
| 103 helper_.ControlTaskRunner()), | 106 helper_.ControlTaskRunner()), |
| 107 seqlock_queueing_time_estimator_( | |
| 108 QueueingTimeEstimator(this, base::TimeDelta::FromSeconds(1))), | |
| 104 main_thread_only_(this, | 109 main_thread_only_(this, |
| 105 compositor_task_runner_, | 110 compositor_task_runner_, |
| 106 helper_.scheduler_tqm_delegate().get(), | 111 helper_.scheduler_tqm_delegate().get(), |
| 107 helper_.scheduler_tqm_delegate()->NowTicks()), | 112 helper_.scheduler_tqm_delegate()->NowTicks()), |
| 113 any_thread_(this), | |
| 108 policy_may_need_update_(&any_thread_lock_), | 114 policy_may_need_update_(&any_thread_lock_), |
| 115 main_thread_responsiveness_threshold_(kMainThreadResponsivenessThreshold), | |
| 109 weak_factory_(this) { | 116 weak_factory_(this) { |
| 110 task_queue_throttler_.reset( | 117 task_queue_throttler_.reset( |
| 111 new TaskQueueThrottler(this, "renderer.scheduler")); | 118 new TaskQueueThrottler(this, "renderer.scheduler")); |
| 112 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 119 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 113 weak_factory_.GetWeakPtr()); | 120 weak_factory_.GetWeakPtr()); |
| 114 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 121 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
| 115 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 122 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
| 116 | 123 |
| 117 suspend_timers_when_backgrounded_closure_.Reset( | 124 suspend_timers_when_backgrounded_closure_.Reset( |
| 118 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 125 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 169 RendererSchedulerImpl* renderer_scheduler_impl, | 176 RendererSchedulerImpl* renderer_scheduler_impl, |
| 170 const scoped_refptr<TaskQueue>& compositor_task_runner, | 177 const scoped_refptr<TaskQueue>& compositor_task_runner, |
| 171 base::TickClock* time_source, | 178 base::TickClock* time_source, |
| 172 base::TimeTicks now) | 179 base::TimeTicks now) |
| 173 : loading_task_cost_estimator(time_source, | 180 : loading_task_cost_estimator(time_source, |
| 174 kLoadingTaskEstimationSampleCount, | 181 kLoadingTaskEstimationSampleCount, |
| 175 kLoadingTaskEstimationPercentile), | 182 kLoadingTaskEstimationPercentile), |
| 176 timer_task_cost_estimator(time_source, | 183 timer_task_cost_estimator(time_source, |
| 177 kTimerTaskEstimationSampleCount, | 184 kTimerTaskEstimationSampleCount, |
| 178 kTimerTaskEstimationPercentile), | 185 kTimerTaskEstimationPercentile), |
| 179 queueing_time_estimator(renderer_scheduler_impl, | |
| 180 base::TimeDelta::FromSeconds(1)), | |
| 181 idle_time_estimator(compositor_task_runner, | 186 idle_time_estimator(compositor_task_runner, |
| 182 time_source, | 187 time_source, |
| 183 kShortIdlePeriodDurationSampleCount, | 188 kShortIdlePeriodDurationSampleCount, |
| 184 kShortIdlePeriodDurationPercentile), | 189 kShortIdlePeriodDurationPercentile), |
| 185 background_main_thread_load_tracker( | 190 background_main_thread_load_tracker( |
| 186 now, | 191 now, |
| 187 base::Bind(&ReportBackgroundRendererTaskLoad), | 192 base::Bind(&ReportBackgroundRendererTaskLoad), |
| 188 kThreadLoadTrackerReportingInterval, | 193 kThreadLoadTrackerReportingInterval, |
| 189 kThreadLoadTrackerWaitingPeriodBeforeReporting), | 194 kThreadLoadTrackerWaitingPeriodBeforeReporting), |
| 190 foreground_main_thread_load_tracker( | 195 foreground_main_thread_load_tracker( |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 210 have_reported_blocking_intervention_since_navigation(false), | 215 have_reported_blocking_intervention_since_navigation(false), |
| 211 has_visible_render_widget_with_touch_handler(false), | 216 has_visible_render_widget_with_touch_handler(false), |
| 212 begin_frame_not_expected_soon(false), | 217 begin_frame_not_expected_soon(false), |
| 213 in_idle_period_for_testing(false), | 218 in_idle_period_for_testing(false), |
| 214 use_virtual_time(false), | 219 use_virtual_time(false), |
| 215 is_audio_playing(false), | 220 is_audio_playing(false), |
| 216 rail_mode_observer(nullptr) {} | 221 rail_mode_observer(nullptr) {} |
| 217 | 222 |
| 218 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} | 223 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} |
| 219 | 224 |
| 220 RendererSchedulerImpl::AnyThread::AnyThread() | 225 RendererSchedulerImpl::AnyThread::AnyThread( |
| 226 RendererSchedulerImpl* renderer_scheduler_impl) | |
|
alex clarke (OOO till 29th)
2016/12/15 14:24:37
nit: this seems unused - lets revert this change.
tdresser
2016/12/15 14:53:25
Done.
| |
| 221 : awaiting_touch_start_response(false), | 227 : awaiting_touch_start_response(false), |
| 222 in_idle_period(false), | 228 in_idle_period(false), |
| 223 begin_main_frame_on_critical_path(false), | 229 begin_main_frame_on_critical_path(false), |
| 224 last_gesture_was_compositor_driven(false), | 230 last_gesture_was_compositor_driven(false), |
| 225 default_gesture_prevented(true), | 231 default_gesture_prevented(true), |
| 226 have_seen_touchstart(false), | 232 have_seen_touchstart(false), |
| 227 waiting_for_meaningful_paint(false), | 233 waiting_for_meaningful_paint(false), |
| 228 have_seen_input_since_navigation(false) {} | 234 have_seen_input_since_navigation(false) {} |
| 229 | 235 |
| 230 RendererSchedulerImpl::AnyThread::~AnyThread() {} | 236 RendererSchedulerImpl::AnyThread::~AnyThread() {} |
| 231 | 237 |
| 232 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() | 238 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() |
| 233 : last_input_type(blink::WebInputEvent::Undefined) {} | 239 : last_input_type(blink::WebInputEvent::Undefined), |
| 240 main_thread_seems_unresponsive(false) {} | |
| 234 | 241 |
| 235 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} | 242 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} |
| 236 | 243 |
| 237 void RendererSchedulerImpl::Shutdown() { | 244 void RendererSchedulerImpl::Shutdown() { |
| 238 base::TimeTicks now = tick_clock()->NowTicks(); | 245 base::TimeTicks now = tick_clock()->NowTicks(); |
| 239 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); | 246 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); |
| 240 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); | 247 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); |
| 241 | 248 |
| 242 task_queue_throttler_.reset(); | 249 task_queue_throttler_.reset(); |
| 243 helper_.Shutdown(); | 250 helper_.Shutdown(); |
| (...skipping 1350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1594 default_loading_task_runner_->SetBlameContext(blame_context); | 1601 default_loading_task_runner_->SetBlameContext(blame_context); |
| 1595 default_timer_task_runner_->SetBlameContext(blame_context); | 1602 default_timer_task_runner_->SetBlameContext(blame_context); |
| 1596 compositor_task_runner_->SetBlameContext(blame_context); | 1603 compositor_task_runner_->SetBlameContext(blame_context); |
| 1597 idle_helper_.IdleTaskRunner()->SetBlameContext(blame_context); | 1604 idle_helper_.IdleTaskRunner()->SetBlameContext(blame_context); |
| 1598 } | 1605 } |
| 1599 | 1606 |
| 1600 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { | 1607 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { |
| 1601 MainThreadOnly().rail_mode_observer = observer; | 1608 MainThreadOnly().rail_mode_observer = observer; |
| 1602 } | 1609 } |
| 1603 | 1610 |
| 1611 bool RendererSchedulerImpl::MainThreadSeemsUnresponsive() { | |
| 1612 base::TimeTicks now = tick_clock()->NowTicks(); | |
| 1613 base::TimeDelta estimated_queueing_time; | |
| 1614 | |
| 1615 bool can_read = false; | |
| 1616 QueueingTimeEstimator::State queueing_time_estimator_state; | |
| 1617 | |
| 1618 base::subtle::Atomic32 version; | |
| 1619 seqlock_queueing_time_estimator_.seqlock.ReadOrFail(&can_read, &version); | |
| 1620 | |
| 1621 // If we fail to determine if the main thread is busy, assume whether or not | |
| 1622 // it's busy hasn't change since the last time we asked. | |
| 1623 if (!can_read) | |
| 1624 return CompositorThreadOnly().main_thread_seems_unresponsive; | |
| 1625 | |
| 1626 queueing_time_estimator_state = seqlock_queueing_time_estimator_.data.state(); | |
| 1627 | |
| 1628 // If we fail to determine if the main thread is busy, assume whether or not | |
| 1629 // it's busy hasn't change since the last time we asked. | |
| 1630 if (seqlock_queueing_time_estimator_.seqlock.ReadRetry(version)) | |
| 1631 return CompositorThreadOnly().main_thread_seems_unresponsive; | |
| 1632 | |
| 1633 QueueingTimeEstimator queueing_time_estimator(queueing_time_estimator_state); | |
| 1634 | |
| 1635 estimated_queueing_time = | |
| 1636 queueing_time_estimator.EstimateQueueingTimeIncludingCurrentTask(now); | |
| 1637 | |
| 1638 bool main_thread_seems_unresponsive = | |
| 1639 estimated_queueing_time > main_thread_responsiveness_threshold_; | |
| 1640 CompositorThreadOnly().main_thread_seems_unresponsive = | |
| 1641 main_thread_seems_unresponsive; | |
| 1642 | |
| 1643 return main_thread_seems_unresponsive; | |
| 1644 } | |
| 1645 | |
| 1604 void RendererSchedulerImpl::RegisterTimeDomain(TimeDomain* time_domain) { | 1646 void RendererSchedulerImpl::RegisterTimeDomain(TimeDomain* time_domain) { |
| 1605 helper_.RegisterTimeDomain(time_domain); | 1647 helper_.RegisterTimeDomain(time_domain); |
| 1606 } | 1648 } |
| 1607 | 1649 |
| 1608 void RendererSchedulerImpl::UnregisterTimeDomain(TimeDomain* time_domain) { | 1650 void RendererSchedulerImpl::UnregisterTimeDomain(TimeDomain* time_domain) { |
| 1609 helper_.UnregisterTimeDomain(time_domain); | 1651 helper_.UnregisterTimeDomain(time_domain); |
| 1610 } | 1652 } |
| 1611 | 1653 |
| 1612 base::TickClock* RendererSchedulerImpl::tick_clock() const { | 1654 base::TickClock* RendererSchedulerImpl::tick_clock() const { |
| 1613 return helper_.scheduler_tqm_delegate().get(); | 1655 return helper_.scheduler_tqm_delegate().get(); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1658 base::AutoLock lock(any_thread_lock_); | 1700 base::AutoLock lock(any_thread_lock_); |
| 1659 if (!AnyThread().have_seen_touchstart) | 1701 if (!AnyThread().have_seen_touchstart) |
| 1660 return; | 1702 return; |
| 1661 } | 1703 } |
| 1662 MainThreadOnly().have_reported_blocking_intervention_since_navigation = | 1704 MainThreadOnly().have_reported_blocking_intervention_since_navigation = |
| 1663 true; | 1705 true; |
| 1664 BroadcastIntervention( | 1706 BroadcastIntervention( |
| 1665 "Blink deferred a task in order to make scrolling smoother. " | 1707 "Blink deferred a task in order to make scrolling smoother. " |
| 1666 "Your timer and network tasks should take less than 50ms to run " | 1708 "Your timer and network tasks should take less than 50ms to run " |
| 1667 "to avoid this. Please see " | 1709 "to avoid this. Please see " |
| 1668 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" | 1710 "https://developers.google.com/web/tools/chrome-devtools/profile/" |
| 1711 "evaluate-performance/rail" | |
| 1669 " and https://crbug.com/574343#c40 for more information."); | 1712 " and https://crbug.com/574343#c40 for more information."); |
| 1670 } | 1713 } |
| 1671 } | 1714 } |
| 1672 | 1715 |
| 1716 void RendererSchedulerImpl::willProcessTask(TaskQueue* task_queue, | |
| 1717 double start_time) { | |
| 1718 base::TimeTicks start_time_ticks = | |
| 1719 MonotonicTimeInSecondsToTimeTicks(start_time); | |
| 1720 MainThreadOnly().current_task_start_time = start_time_ticks; | |
| 1721 seqlock_queueing_time_estimator_.seqlock.WriteBegin(); | |
| 1722 seqlock_queueing_time_estimator_.data.OnTopLevelTaskStarted(start_time_ticks); | |
| 1723 seqlock_queueing_time_estimator_.seqlock.WriteEnd(); | |
| 1724 } | |
| 1725 | |
| 1673 void RendererSchedulerImpl::didProcessTask(TaskQueue* task_queue, | 1726 void RendererSchedulerImpl::didProcessTask(TaskQueue* task_queue, |
| 1674 double start_time, | 1727 double start_time, |
| 1675 double end_time) { | 1728 double end_time) { |
| 1676 // TODO(scheduler-dev): Remove conversions when Blink starts using | 1729 // TODO(scheduler-dev): Remove conversions when Blink starts using |
| 1677 // base::TimeTicks instead of doubles for time. | 1730 // base::TimeTicks instead of doubles for time. |
| 1678 base::TimeTicks start_time_ticks = | 1731 base::TimeTicks start_time_ticks = |
| 1679 MonotonicTimeInSecondsToTimeTicks(start_time); | 1732 MonotonicTimeInSecondsToTimeTicks(start_time); |
| 1680 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); | 1733 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time); |
| 1681 | 1734 |
| 1682 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted( | 1735 seqlock_queueing_time_estimator_.seqlock.WriteBegin(); |
| 1683 start_time_ticks, end_time_ticks); | 1736 seqlock_queueing_time_estimator_.data.OnTopLevelTaskCompleted(end_time_ticks); |
| 1737 seqlock_queueing_time_estimator_.seqlock.WriteEnd(); | |
| 1684 | 1738 |
| 1685 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, | 1739 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, |
| 1686 end_time_ticks); | 1740 end_time_ticks); |
| 1687 | 1741 |
| 1688 // We want to measure thread time here, but for efficiency reasons | 1742 // We want to measure thread time here, but for efficiency reasons |
| 1689 // we stick with wall time. | 1743 // we stick with wall time. |
| 1690 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( | 1744 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
| 1691 start_time_ticks, end_time_ticks); | 1745 start_time_ticks, end_time_ticks); |
| 1692 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( | 1746 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
| 1693 start_time_ticks, end_time_ticks); | 1747 start_time_ticks, end_time_ticks); |
| 1694 // TODO(altimin): Per-page metrics should also be considered. | 1748 // TODO(altimin): Per-page metrics should also be considered. |
| 1695 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", | 1749 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 1696 (end_time_ticks - start_time_ticks).InMicroseconds (), 1, | 1750 "RendererScheduler.TaskTime", |
| 1697 1000000, 50); | 1751 (end_time_ticks - start_time_ticks).InMicroseconds(), 1, 1000000, 50); |
| 1698 UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType", | 1752 UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType", |
| 1699 static_cast<int>(task_queue->GetQueueType()), | 1753 static_cast<int>(task_queue->GetQueueType()), |
| 1700 static_cast<int>(TaskQueue::QueueType::COUNT)); | 1754 static_cast<int>(TaskQueue::QueueType::COUNT)); |
| 1701 } | 1755 } |
| 1702 | 1756 |
| 1703 void RendererSchedulerImpl::AddTaskTimeObserver( | 1757 void RendererSchedulerImpl::AddTaskTimeObserver( |
| 1704 TaskTimeObserver* task_time_observer) { | 1758 TaskTimeObserver* task_time_observer) { |
| 1705 helper_.AddTaskTimeObserver(task_time_observer); | 1759 helper_.AddTaskTimeObserver(task_time_observer); |
| 1706 } | 1760 } |
| 1707 | 1761 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1817 case TimeDomainType::VIRTUAL: | 1871 case TimeDomainType::VIRTUAL: |
| 1818 return "virtual"; | 1872 return "virtual"; |
| 1819 default: | 1873 default: |
| 1820 NOTREACHED(); | 1874 NOTREACHED(); |
| 1821 return nullptr; | 1875 return nullptr; |
| 1822 } | 1876 } |
| 1823 } | 1877 } |
| 1824 | 1878 |
| 1825 } // namespace scheduler | 1879 } // namespace scheduler |
| 1826 } // namespace blink | 1880 } // namespace blink |
| OLD | NEW |