Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc b/third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc |
| index a8efe8d5d6b551286fa30c46fa604bd55904976c..d328dfdae0774f86f148f5745636c06feedc1f97 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc |
| @@ -4,7 +4,7 @@ |
| #include "platform/scheduler/base/queueing_time_estimator.h" |
| -#include "base/time/default_tick_clock.h" |
| +#include "base/memory/ptr_util.h" |
| #include <algorithm> |
| @@ -59,9 +59,14 @@ QueueingTimeEstimator::QueueingTimeEstimator( |
| window_duration_(window_duration), |
| window_start_time_() {} |
| -void QueueingTimeEstimator::OnToplevelTaskCompleted( |
| +void QueueingTimeEstimator::OnTopLevelTaskStarted(base::TimeTicks task_start_time) { |
| + current_task_start_time_ = task_start_time; |
| +} |
| + |
| +void QueueingTimeEstimator::OnTopLevelTaskCompleted( |
| base::TimeTicks task_start_time, |
| base::TimeTicks task_end_time) { |
| + current_task_start_time_ = base::TimeTicks(); |
| if (window_start_time_.is_null()) |
| window_start_time_ = task_start_time; |
| @@ -82,6 +87,66 @@ void QueueingTimeEstimator::OnToplevelTaskCompleted( |
| window_start_time_ + window_duration_); |
| } |
| +// Keeps track of the maximum queueing time. |
| +class RecordMaxQueueingTimeClient : public QueueingTimeEstimator::Client { |
| + public: |
| + void OnQueueingTimeForWindowEstimated( |
| + base::TimeDelta queueing_time) override { |
| + worst_queueing_time_ = std::max(worst_queueing_time_, queueing_time); |
| + } |
| + |
| + base::TimeDelta worst_queueing_time() { |
|
Sami
2016/08/24 14:56:01
naming nit: "worst_queueing_time" is subjective bu
tdresser
2016/08/24 17:22:50
Done.
|
| + return worst_queueing_time_; |
| + } |
| + |
| + RecordMaxQueueingTimeClient() {} |
| + ~RecordMaxQueueingTimeClient() override {} |
| + |
| + private: |
| + base::TimeDelta worst_queueing_time_; |
| + DISALLOW_COPY_AND_ASSIGN(RecordMaxQueueingTimeClient); |
| +}; |
| + |
| +base::TimeDelta QueueingTimeEstimator::EstimateQueueingTimeIncludingCurrentTask( |
| + base::TimeTicks now) const { |
| + RecordMaxQueueingTimeClient record_max_queueing_time_client; |
| + |
| + // Make a copy of this QueueingTimeEstimator. We'll use it to evaluate the |
| + // estimated input latency, assuming that any active task ends now. |
| + std::unique_ptr<QueueingTimeEstimator> temporary_queueing_time_estimator = |
| + CloneWithClient(&record_max_queueing_time_client); |
| + |
| + // Use a task of length zero to ensure we consider the most recent window |
| + // (aligned to window intervals). |
| + base::TimeTicks start_time = now; |
| + base::TimeTicks end_time = now; |
| + |
| + // If there's a task in progress, pretend it ends now, and include it in the |
| + // computation. |
| + if (!current_task_start_time_.is_null()) |
| + start_time = current_task_start_time_; |
| + |
| + temporary_queueing_time_estimator->OnTopLevelTaskCompleted(start_time, |
| + end_time); |
| + |
| + // Report the worst queueing time, out of all windows spanned and the current |
| + // window. |
| + return std::max( |
| + record_max_queueing_time_client.worst_queueing_time(), |
| + temporary_queueing_time_estimator->current_expected_queueing_time_); |
| +} |
| + |
| +std::unique_ptr<QueueingTimeEstimator> QueueingTimeEstimator::CloneWithClient( |
| + Client* client) const { |
| + auto queueing_time_estimator = |
| + base::MakeUnique<QueueingTimeEstimator>(client, window_duration_); |
| + queueing_time_estimator->current_expected_queueing_time_ = |
| + current_expected_queueing_time_; |
| + queueing_time_estimator->window_start_time_ = window_start_time_; |
| + queueing_time_estimator->current_task_start_time_ = current_task_start_time_; |
| + return queueing_time_estimator; |
| +} |
| + |
| bool QueueingTimeEstimator::TimePastWindowEnd(base::TimeTicks time) { |
| return time > window_start_time_ + window_duration_; |
| } |