summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-13 15:05:36 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-14 10:33:47 +0000
commite684a3455bcc29a6e3e66a004e352dea4e1141e7 (patch)
treed55b4003bde34d7d05f558f02cfd82b2a66a7aac /chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc
parent2b94bfe47ccb6c08047959d1c26e392919550e86 (diff)
downloadqtwebengine-chromium-e684a3455bcc29a6e3e66a004e352dea4e1141e7.tar.gz
BASELINE: Update Chromium to 72.0.3626.110 and Ninja to 1.9.0
Change-Id: Ic57220b00ecc929a893c91f5cc552f5d3e99e922 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc100
1 files changed, 100 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc b/chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc
new file mode 100644
index 00000000000..1f2ce23d62f
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.cc
@@ -0,0 +1,100 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/scheduler/common/single_thread_idle_task_runner.h"
+
+#include "base/location.h"
+#include "base/single_thread_task_runner.h"
+#include "base/trace_event/blame_context.h"
+#include "base/trace_event/trace_event.h"
+
+namespace blink {
+namespace scheduler {
+
+SingleThreadIdleTaskRunner::SingleThreadIdleTaskRunner(
+ scoped_refptr<base::SingleThreadTaskRunner> idle_priority_task_runner,
+ Delegate* delegate)
+ : idle_priority_task_runner_(idle_priority_task_runner),
+ delegate_(delegate),
+ blame_context_(nullptr),
+ weak_factory_(this) {
+ DCHECK(!idle_priority_task_runner_ ||
+ idle_priority_task_runner_->RunsTasksInCurrentSequence());
+ weak_scheduler_ptr_ = weak_factory_.GetWeakPtr();
+}
+
+SingleThreadIdleTaskRunner::~SingleThreadIdleTaskRunner() = default;
+
+SingleThreadIdleTaskRunner::Delegate::Delegate() = default;
+
+SingleThreadIdleTaskRunner::Delegate::~Delegate() = default;
+
+bool SingleThreadIdleTaskRunner::RunsTasksInCurrentSequence() const {
+ return idle_priority_task_runner_->RunsTasksInCurrentSequence();
+}
+
+void SingleThreadIdleTaskRunner::PostIdleTask(const base::Location& from_here,
+ IdleTask idle_task) {
+ delegate_->OnIdleTaskPosted();
+ idle_priority_task_runner_->PostTask(
+ from_here, base::BindOnce(&SingleThreadIdleTaskRunner::RunTask,
+ weak_scheduler_ptr_, std::move(idle_task)));
+}
+
+void SingleThreadIdleTaskRunner::PostDelayedIdleTask(
+ const base::Location& from_here,
+ const base::TimeDelta delay,
+ IdleTask idle_task) {
+ base::TimeTicks first_run_time = delegate_->NowTicks() + delay;
+ delayed_idle_tasks_.insert(std::make_pair(
+ first_run_time,
+ std::make_pair(
+ from_here,
+ base::BindOnce(&SingleThreadIdleTaskRunner::RunTask,
+ weak_scheduler_ptr_, std::move(idle_task)))));
+}
+
+void SingleThreadIdleTaskRunner::PostNonNestableIdleTask(
+ const base::Location& from_here,
+ IdleTask idle_task) {
+ delegate_->OnIdleTaskPosted();
+ idle_priority_task_runner_->PostNonNestableTask(
+ from_here, base::BindOnce(&SingleThreadIdleTaskRunner::RunTask,
+ weak_scheduler_ptr_, std::move(idle_task)));
+}
+
+void SingleThreadIdleTaskRunner::EnqueueReadyDelayedIdleTasks() {
+ if (delayed_idle_tasks_.empty())
+ return;
+
+ base::TimeTicks now = delegate_->NowTicks();
+ while (!delayed_idle_tasks_.empty() &&
+ delayed_idle_tasks_.begin()->first <= now) {
+ idle_priority_task_runner_->PostTask(
+ delayed_idle_tasks_.begin()->second.first,
+ std::move(delayed_idle_tasks_.begin()->second.second));
+ delayed_idle_tasks_.erase(delayed_idle_tasks_.begin());
+ }
+}
+
+void SingleThreadIdleTaskRunner::RunTask(IdleTask idle_task) {
+ base::TimeTicks deadline = delegate_->WillProcessIdleTask();
+ TRACE_EVENT1("renderer.scheduler", "SingleThreadIdleTaskRunner::RunTask",
+ "allotted_time_ms",
+ (deadline - base::TimeTicks::Now()).InMillisecondsF());
+ if (blame_context_)
+ blame_context_->Enter();
+ std::move(idle_task).Run(deadline);
+ if (blame_context_)
+ blame_context_->Leave();
+ delegate_->DidProcessIdleTask();
+}
+
+void SingleThreadIdleTaskRunner::SetBlameContext(
+ base::trace_event::BlameContext* blame_context) {
+ blame_context_ = blame_context;
+}
+
+} // namespace scheduler
+} // namespace blink