1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_helper.h"
6 
7 #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h"
8 
9 namespace blink {
10 namespace scheduler {
11 
12 using base::sequence_manager::TaskQueue;
13 
MainThreadSchedulerHelper(base::sequence_manager::SequenceManager * sequence_manager,MainThreadSchedulerImpl * main_thread_scheduler)14 MainThreadSchedulerHelper::MainThreadSchedulerHelper(
15     base::sequence_manager::SequenceManager* sequence_manager,
16     MainThreadSchedulerImpl* main_thread_scheduler)
17     : SchedulerHelper(sequence_manager),
18       main_thread_scheduler_(main_thread_scheduler),
19       // TODO(hajimehoshi): Forbid V8 execution at |default_task_queue_|
20       // (crbug.com/870606).
21       default_task_queue_(
22           NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
23                            MainThreadTaskQueue::QueueType::kDefault)
24                            .SetShouldMonitorQuiescence(true))),
25       control_task_queue_(
26           NewTaskQueue(MainThreadTaskQueue::QueueCreationParams(
27                            MainThreadTaskQueue::QueueType::kControl)
28                            .SetShouldNotifyObservers(false))) {
29   InitDefaultQueues(default_task_queue_, control_task_queue_,
30                     TaskType::kMainThreadTaskQueueDefault);
31   sequence_manager_->EnableCrashKeys("blink_scheduler_async_stack");
32 }
33 
~MainThreadSchedulerHelper()34 MainThreadSchedulerHelper::~MainThreadSchedulerHelper() {
35   control_task_queue_->ShutdownTaskQueue();
36   default_task_queue_->ShutdownTaskQueue();
37 }
38 
39 scoped_refptr<MainThreadTaskQueue>
DefaultMainThreadTaskQueue()40 MainThreadSchedulerHelper::DefaultMainThreadTaskQueue() {
41   return default_task_queue_;
42 }
43 
DefaultTaskQueue()44 scoped_refptr<TaskQueue> MainThreadSchedulerHelper::DefaultTaskQueue() {
45   return default_task_queue_;
46 }
47 
48 scoped_refptr<MainThreadTaskQueue>
ControlMainThreadTaskQueue()49 MainThreadSchedulerHelper::ControlMainThreadTaskQueue() {
50   return control_task_queue_;
51 }
52 
ControlTaskQueue()53 scoped_refptr<TaskQueue> MainThreadSchedulerHelper::ControlTaskQueue() {
54   return control_task_queue_;
55 }
56 
57 scoped_refptr<base::SingleThreadTaskRunner>
DeprecatedDefaultTaskRunner()58 MainThreadSchedulerHelper::DeprecatedDefaultTaskRunner() {
59   // TODO(hajimehoshi): Introduce a different task queue from the default task
60   // queue and return the task runner created from it.
61   return DefaultTaskRunner();
62 }
63 
NewTaskQueue(const MainThreadTaskQueue::QueueCreationParams & params)64 scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue(
65     const MainThreadTaskQueue::QueueCreationParams& params) {
66   scoped_refptr<MainThreadTaskQueue> task_queue =
67       sequence_manager_->CreateTaskQueueWithType<MainThreadTaskQueue>(
68           params.spec, params, main_thread_scheduler_);
69   if (params.fixed_priority)
70     task_queue->SetQueuePriority(params.fixed_priority.value());
71   return task_queue;
72 }
73 
ShutdownAllQueues()74 void MainThreadSchedulerHelper::ShutdownAllQueues() {
75   default_task_queue_->ShutdownTaskQueue();
76   control_task_queue_->ShutdownTaskQueue();
77 }
78 
79 }  // namespace scheduler
80 }  // namespace blink
81