| 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..5aa037205ffa6c622e130e85b22c882cfefcb277 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,17 +59,21 @@ QueueingTimeEstimator::QueueingTimeEstimator(
|
| window_duration_(window_duration),
|
| window_start_time_() {}
|
|
|
| -void QueueingTimeEstimator::OnToplevelTaskCompleted(
|
| - base::TimeTicks task_start_time,
|
| +void QueueingTimeEstimator::OnTopLevelTaskStarted(
|
| + base::TimeTicks task_start_time) {
|
| + current_task_start_time_ = task_start_time;
|
| +}
|
| +
|
| +void QueueingTimeEstimator::OnTopLevelTaskCompleted(
|
| base::TimeTicks task_end_time) {
|
| if (window_start_time_.is_null())
|
| - window_start_time_ = task_start_time;
|
| + window_start_time_ = current_task_start_time_;
|
|
|
| while (TimePastWindowEnd(task_end_time)) {
|
| - if (!TimePastWindowEnd(task_start_time)) {
|
| + if (!TimePastWindowEnd(current_task_start_time_)) {
|
| // Include the current task in this window.
|
| current_expected_queueing_time_ += ExpectedQueueingTimeFromTask(
|
| - task_start_time, task_end_time, window_start_time_,
|
| + current_task_start_time_, task_end_time, window_start_time_,
|
| window_start_time_ + window_duration_);
|
| }
|
| client_->OnQueueingTimeForWindowEstimated(current_expected_queueing_time_);
|
| @@ -78,10 +82,62 @@ void QueueingTimeEstimator::OnToplevelTaskCompleted(
|
| }
|
|
|
| current_expected_queueing_time_ += ExpectedQueueingTimeFromTask(
|
| - task_start_time, task_end_time, window_start_time_,
|
| + current_task_start_time_, task_end_time, window_start_time_,
|
| window_start_time_ + window_duration_);
|
| +
|
| + current_task_start_time_ = base::TimeTicks();
|
| +}
|
| +
|
| +// Keeps track of the maximum queueing time.
|
| +class RecordMaxQueueingTimeClient : public QueueingTimeEstimator::Client {
|
| + public:
|
| + void OnQueueingTimeForWindowEstimated(
|
| + base::TimeDelta queueing_time) override {
|
| + max_queueing_time_ = std::max(max_queueing_time_, queueing_time);
|
| + }
|
| +
|
| + base::TimeDelta max_queueing_time() { return max_queueing_time_; }
|
| +
|
| + RecordMaxQueueingTimeClient() {}
|
| + ~RecordMaxQueueingTimeClient() override {}
|
| +
|
| + private:
|
| + base::TimeDelta max_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.
|
| + QueueingTimeEstimator temporary_queueing_time_estimator(*this);
|
| + temporary_queueing_time_estimator.client_ = &record_max_queueing_time_client;
|
| +
|
| + if (!current_task_start_time_.is_null()) {
|
| + // There's a task in progress, pretend it ends now, and include it in the
|
| + // computation.
|
| + temporary_queueing_time_estimator.OnTopLevelTaskCompleted(now);
|
| + }
|
| +
|
| + // Report the max queueing time, out of all windows spanned and the current
|
| + // window.
|
| + return std::max(
|
| + record_max_queueing_time_client.max_queueing_time(),
|
| + temporary_queueing_time_estimator.current_expected_queueing_time_);
|
| }
|
|
|
| +QueueingTimeEstimator::QueueingTimeEstimator(
|
| + const QueueingTimeEstimator& queueing_time_estimator)
|
| + : client_(queueing_time_estimator.client_),
|
| + current_expected_queueing_time_(
|
| + queueing_time_estimator.current_expected_queueing_time_),
|
| + window_duration_(queueing_time_estimator.window_duration_),
|
| + window_start_time_(queueing_time_estimator.window_start_time_),
|
| + current_task_start_time_(
|
| + queueing_time_estimator.current_task_start_time_) {}
|
| +
|
| bool QueueingTimeEstimator::TimePastWindowEnd(base::TimeTicks time) {
|
| return time > window_start_time_ + window_duration_;
|
| }
|
|
|