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