| 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..43dc1b021162bb29f043b1d8c6280a9b288878b4 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,33 @@ QueueingTimeEstimator::QueueingTimeEstimator(
|
| window_duration_(window_duration),
|
| window_start_time_() {}
|
|
|
| -void QueueingTimeEstimator::OnToplevelTaskCompleted(
|
| - base::TimeTicks task_start_time,
|
| +QueueingTimeEstimator::QueueingTimeEstimator(
|
| + QueueingTimeEstimator::SerializedQueueingTimeEstimator
|
| + serialized_queueing_time_estimator)
|
| + : current_expected_queueing_time_(base::TimeDelta::FromInternalValue(
|
| + serialized_queueing_time_estimator[0])),
|
| + window_duration_(base::TimeDelta::FromInternalValue(
|
| + serialized_queueing_time_estimator[1])),
|
| + window_start_time_(base::TimeTicks::FromInternalValue(
|
| + serialized_queueing_time_estimator[2])),
|
| + current_task_start_time_(base::TimeTicks::FromInternalValue(
|
| + serialized_queueing_time_estimator[3])) {}
|
| +
|
| +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,8 +94,60 @@ 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();
|
| +}
|
| +
|
| +QueueingTimeEstimator::SerializedQueueingTimeEstimator
|
| +QueueingTimeEstimator::Serialize() const {
|
| + QueueingTimeEstimator::SerializedQueueingTimeEstimator result;
|
| + result[0] = current_expected_queueing_time_.ToInternalValue();
|
| + result[1] = window_duration_.ToInternalValue();
|
| + result[2] = window_start_time_.ToInternalValue();
|
| + result[3] = current_task_start_time_.ToInternalValue();
|
| + return result;
|
| +}
|
| +
|
| +// 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_);
|
| }
|
|
|
| bool QueueingTimeEstimator::TimePastWindowEnd(base::TimeTicks time) {
|
|
|