| 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() {
|
| + 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_;
|
| }
|
|
|