1 // Copyright 2019 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 "content/browser/scheduler/browser_ui_thread_scheduler.h"
6 
7 #include <utility>
8 
9 #include "base/feature_list.h"
10 #include "base/logging.h"
11 #include "base/memory/ptr_util.h"
12 #include "base/message_loop/message_pump.h"
13 #include "base/message_loop/message_pump_type.h"
14 #include "base/process/process.h"
15 #include "base/run_loop.h"
16 #include "base/task/sequence_manager/sequence_manager.h"
17 #include "base/task/sequence_manager/sequence_manager_impl.h"
18 #include "base/task/sequence_manager/task_queue.h"
19 #include "base/task/sequence_manager/time_domain.h"
20 #include "base/threading/platform_thread.h"
21 #include "build/build_config.h"
22 #include "content/public/browser/browser_thread.h"
23 #include "content/public/common/content_features.h"
24 
25 namespace content {
26 
27 BrowserUIThreadScheduler::~BrowserUIThreadScheduler() = default;
28 
29 // static
30 std::unique_ptr<BrowserUIThreadScheduler>
CreateForTesting(base::sequence_manager::SequenceManager * sequence_manager,base::sequence_manager::TimeDomain * time_domain)31 BrowserUIThreadScheduler::CreateForTesting(
32     base::sequence_manager::SequenceManager* sequence_manager,
33     base::sequence_manager::TimeDomain* time_domain) {
34   return base::WrapUnique(
35       new BrowserUIThreadScheduler(sequence_manager, time_domain));
36 }
37 
BrowserUIThreadScheduler()38 BrowserUIThreadScheduler::BrowserUIThreadScheduler()
39     : owned_sequence_manager_(
40           base::sequence_manager::CreateUnboundSequenceManager(
41               base::sequence_manager::SequenceManager::Settings::Builder()
42                   .SetMessagePumpType(base::MessagePumpType::UI)
43                   .Build())),
44       task_queues_(BrowserThread::UI,
45                    owned_sequence_manager_.get(),
46                    owned_sequence_manager_->GetRealTimeDomain()),
47       handle_(task_queues_.GetHandle()) {
48   CommonSequenceManagerSetup(owned_sequence_manager_.get());
49   owned_sequence_manager_->SetDefaultTaskRunner(
50       handle_->GetDefaultTaskRunner());
51 
52   owned_sequence_manager_->BindToMessagePump(
53       base::MessagePump::Create(base::MessagePumpType::UI));
54 }
55 
BrowserUIThreadScheduler(base::sequence_manager::SequenceManager * sequence_manager,base::sequence_manager::TimeDomain * time_domain)56 BrowserUIThreadScheduler::BrowserUIThreadScheduler(
57     base::sequence_manager::SequenceManager* sequence_manager,
58     base::sequence_manager::TimeDomain* time_domain)
59     : task_queues_(BrowserThread::UI, sequence_manager, time_domain),
60       handle_(task_queues_.GetHandle()) {
61   CommonSequenceManagerSetup(sequence_manager);
62 }
63 
CommonSequenceManagerSetup(base::sequence_manager::SequenceManager * sequence_manager)64 void BrowserUIThreadScheduler::CommonSequenceManagerSetup(
65     base::sequence_manager::SequenceManager* sequence_manager) {
66   sequence_manager->EnableCrashKeys("ui_scheduler_async_stack");
67 }
68 
69 }  // namespace content
70