summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_web_scheduling_task_queue_impl.cc
blob: a14b6e55102124bb4314d3f2024432e301180a7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Copyright 2019 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/main_thread/main_thread_web_scheduling_task_queue_impl.h"

#include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h"

namespace blink {
namespace scheduler {

MainThreadWebSchedulingTaskQueueImpl::WebSchedulingTaskRunner::
    WebSchedulingTaskRunner(
        scoped_refptr<base::SingleThreadTaskRunner> immediate_task_runner,
        scoped_refptr<base::SingleThreadTaskRunner> delayed_task_runner)
    : immediate_task_runner_(std::move(immediate_task_runner)),
      delayed_task_runner_(std::move(delayed_task_runner)) {}

bool MainThreadWebSchedulingTaskQueueImpl::WebSchedulingTaskRunner::
    PostDelayedTask(const base::Location& location,
                    base::OnceClosure task,
                    base::TimeDelta delay) {
  return GetTaskRunnerForDelay(delay)->PostDelayedTask(location,
                                                       std::move(task), delay);
}

bool MainThreadWebSchedulingTaskQueueImpl::WebSchedulingTaskRunner::
    PostNonNestableDelayedTask(const base::Location& location,
                               base::OnceClosure task,
                               base::TimeDelta delay) {
  return GetTaskRunnerForDelay(delay)->PostNonNestableDelayedTask(
      location, std::move(task), delay);
}

bool MainThreadWebSchedulingTaskQueueImpl::WebSchedulingTaskRunner::
    RunsTasksInCurrentSequence() const {
  DCHECK_EQ(immediate_task_runner_->RunsTasksInCurrentSequence(),
            delayed_task_runner_->RunsTasksInCurrentSequence());
  return immediate_task_runner_->RunsTasksInCurrentSequence();
}

base::SingleThreadTaskRunner* MainThreadWebSchedulingTaskQueueImpl::
    WebSchedulingTaskRunner::GetTaskRunnerForDelay(base::TimeDelta delay) {
  return delay > base::TimeDelta() ? delayed_task_runner_.get()
                                   : immediate_task_runner_.get();
}

MainThreadWebSchedulingTaskQueueImpl::MainThreadWebSchedulingTaskQueueImpl(
    base::WeakPtr<MainThreadTaskQueue> immediate_task_queue,
    base::WeakPtr<MainThreadTaskQueue> delayed_task_queue)
    : task_runner_(base::MakeRefCounted<WebSchedulingTaskRunner>(
          immediate_task_queue->CreateTaskRunner(
              TaskType::kExperimentalWebScheduling),
          delayed_task_queue->CreateTaskRunner(
              TaskType::kExperimentalWebScheduling))),
      immediate_task_queue_(std::move(immediate_task_queue)),
      delayed_task_queue_(std::move(delayed_task_queue)) {}

MainThreadWebSchedulingTaskQueueImpl::~MainThreadWebSchedulingTaskQueueImpl() {
  if (immediate_task_queue_)
    immediate_task_queue_->OnWebSchedulingTaskQueueDestroyed();
  if (delayed_task_queue_)
    delayed_task_queue_->OnWebSchedulingTaskQueueDestroyed();
}

void MainThreadWebSchedulingTaskQueueImpl::SetPriority(
    WebSchedulingPriority priority) {
  if (immediate_task_queue_)
    immediate_task_queue_->SetWebSchedulingPriority(priority);
  if (delayed_task_queue_)
    delayed_task_queue_->SetWebSchedulingPriority(priority);
}

scoped_refptr<base::SingleThreadTaskRunner>
MainThreadWebSchedulingTaskQueueImpl::GetTaskRunner() {
  return task_runner_;
}

}  // namespace scheduler
}  // namespace blink