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..f39754703bd45974d352e0be61ebdca8818da057 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> |
| @@ -55,35 +55,85 @@ base::TimeDelta ExpectedQueueingTimeFromTask(base::TimeTicks task_start, |
| QueueingTimeEstimator::QueueingTimeEstimator( |
| QueueingTimeEstimator::Client* client, |
| base::TimeDelta window_duration) |
| - : client_(client), |
| - window_duration_(window_duration), |
| - window_start_time_() {} |
| + : client_(client) { |
| + data_.window_duration = window_duration; |
| +} |
| + |
| +QueueingTimeEstimator::QueueingTimeEstimator(const Data& data) : data_(data) {} |
|
alex clarke (OOO till 29th)
2016/11/14 17:09:35
client_ is not initialized here.
Looking at the w
tdresser
2016/12/15 13:17:00
We use this contructor in RendererSchedulerImpl no
|
| -void QueueingTimeEstimator::OnToplevelTaskCompleted( |
| - base::TimeTicks task_start_time, |
| +void QueueingTimeEstimator::OnTopLevelTaskStarted( |
| + base::TimeTicks task_start_time) { |
| + data_.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; |
| + if (data_.window_start_time.is_null()) |
|
alex clarke (OOO till 29th)
2016/11/14 17:09:35
bike-shed: all these data_.'s make me wonder if th
tdresser
2016/12/15 13:17:00
Done.
|
| + data_.window_start_time = data_.current_task_start_time; |
| while (TimePastWindowEnd(task_end_time)) { |
| - if (!TimePastWindowEnd(task_start_time)) { |
| + if (!TimePastWindowEnd(data_.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_, |
| - window_start_time_ + window_duration_); |
| + data_.current_expected_queueing_time += ExpectedQueueingTimeFromTask( |
| + data_.current_task_start_time, task_end_time, data_.window_start_time, |
| + data_.window_start_time + data_.window_duration); |
| } |
| - client_->OnQueueingTimeForWindowEstimated(current_expected_queueing_time_); |
| - window_start_time_ += window_duration_; |
| - current_expected_queueing_time_ = base::TimeDelta(); |
| + client_->OnQueueingTimeForWindowEstimated( |
| + data_.current_expected_queueing_time); |
| + data_.window_start_time += data_.window_duration; |
| + data_.current_expected_queueing_time = base::TimeDelta(); |
| + } |
| + |
| + data_.current_expected_queueing_time += ExpectedQueueingTimeFromTask( |
| + data_.current_task_start_time, task_end_time, data_.window_start_time, |
| + data_.window_start_time + data_.window_duration); |
| + |
| + data_.current_task_start_time = base::TimeTicks(); |
| +} |
| + |
| +// Keeps track of the queueing time. |
| +class RecordQueueingTimeClient : public QueueingTimeEstimator::Client { |
| + public: |
| + void OnQueueingTimeForWindowEstimated( |
|
alex clarke (OOO till 29th)
2016/11/14 17:09:35
// QueueingTimeEstimator::Client implementation:
tdresser
2016/12/15 13:17:00
Done.
|
| + base::TimeDelta queueing_time) override { |
| + queueing_time_ = queueing_time; |
| } |
| - current_expected_queueing_time_ += ExpectedQueueingTimeFromTask( |
| - task_start_time, task_end_time, window_start_time_, |
| - window_start_time_ + window_duration_); |
| + base::TimeDelta queueing_time() { return queueing_time_; } |
| + |
| + RecordQueueingTimeClient() {} |
| + ~RecordQueueingTimeClient() override {} |
| + |
| + private: |
| + base::TimeDelta queueing_time_; |
| + DISALLOW_COPY_AND_ASSIGN(RecordQueueingTimeClient); |
| +}; |
| + |
| +base::TimeDelta QueueingTimeEstimator::EstimateQueueingTimeIncludingCurrentTask( |
| + base::TimeTicks now) const { |
| + RecordQueueingTimeClient record_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_queueing_time_client; |
| + |
| + // If there's a task in progress, pretend it ends now, and include it in the |
| + // computation. If there's no task in progress, add an empty task to flush any |
| + // stale windows. |
| + if (data_.current_task_start_time.is_null()) |
| + temporary_queueing_time_estimator.OnTopLevelTaskStarted(now); |
| + temporary_queueing_time_estimator.OnTopLevelTaskCompleted(now); |
| + |
| + // Report the max of the queueing time for the last full window, or the |
| + // current partial window. |
| + return std::max( |
| + record_queueing_time_client.queueing_time(), |
| + temporary_queueing_time_estimator.data_.current_expected_queueing_time); |
| } |
| bool QueueingTimeEstimator::TimePastWindowEnd(base::TimeTicks time) { |
| - return time > window_start_time_ + window_duration_; |
| + return time > data_.window_start_time + data_.window_duration; |
| } |
| } // namespace scheduler |