Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Unified Diff: third_party/WebKit/Source/platform/scheduler/base/queueing_time_estimator.cc

Issue 2273703002: Force events to be non blocking if main thread is unresponsive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Dave's comments. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_;
}

Powered by Google App Engine
This is Rietveld 408576698