blob: 45d35accfd72244ab43512641dcac1446d43c096 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2019 The Chromium Authors
Alex Clarke831ed1e62019-02-18 21:10:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_
6#define CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_
7
8#include <memory>
9
Bartek Nowierskif5eeeba2024-01-25 12:49:3910#include "base/memory/raw_ptr.h"
Carlos Caballeroc472c2bf2019-04-18 09:30:3611#include "base/task/sequence_manager/task_queue.h"
Gabriel Charetted87f10f2022-03-31 00:44:2212#include "base/time/time.h"
Carlos Caballero5f6212b2019-05-13 13:45:1613#include "content/browser/scheduler/browser_task_queues.h"
Alex Clarke831ed1e62019-02-18 21:10:0814#include "content/common/content_export.h"
mikt541ac712025-08-04 03:16:2215#include "content/common/scheduler_loop_quarantine_task_observer.h"
Alex Clarke831ed1e62019-02-18 21:10:0816
17namespace base {
18namespace sequence_manager {
19class SequenceManager;
Alex Clarke831ed1e62019-02-18 21:10:0820} // namespace sequence_manager
21} // namespace base
22
23namespace content {
24class BrowserTaskExecutor;
25
26// The BrowserUIThreadScheduler vends TaskQueues and manipulates them to
27// implement scheduling policy. This class is never deleted in production.
28class CONTENT_EXPORT BrowserUIThreadScheduler {
29 public:
Carlos Caballero5f6212b2019-05-13 13:45:1630 using Handle = BrowserTaskQueues::Handle;
31
Alex Clarke831ed1e62019-02-18 21:10:0832 BrowserUIThreadScheduler();
Peter Boström9b036532021-10-28 23:37:2833
34 BrowserUIThreadScheduler(const BrowserUIThreadScheduler&) = delete;
35 BrowserUIThreadScheduler& operator=(const BrowserUIThreadScheduler&) = delete;
36
Alex Clarke831ed1e62019-02-18 21:10:0837 ~BrowserUIThreadScheduler();
38
Stephen Nusko408b9a92022-09-15 10:03:5739 static BrowserUIThreadScheduler* Get();
40
mikt541ac712025-08-04 03:16:2241 // Unlike the default constructor, this assumes a feature list is ready to be
42 // used. `InstallPartitionAllocSchedulerLoopQuarantineTaskObserver()` is
43 // called automatically.
44 static std::unique_ptr<BrowserUIThreadScheduler> CreateForTesting();
Alex Clarke831ed1e62019-02-18 21:10:0845 // Setting the DefaultTaskRunner is up to the caller.
46 static std::unique_ptr<BrowserUIThreadScheduler> CreateForTesting(
Etienne Pierre-doray40545ac2021-11-11 13:34:2847 base::sequence_manager::SequenceManager* sequence_manager);
Alex Clarke831ed1e62019-02-18 21:10:0848
Carlos Caballero5f6212b2019-05-13 13:45:1649 using QueueType = BrowserTaskQueues::QueueType;
Alex Clarke831ed1e62019-02-18 21:10:0850
Alex Clarke49854cc2019-06-27 08:25:4951 scoped_refptr<Handle> GetHandle() const { return handle_; }
Carlos Caballeroff8c5032019-04-01 11:15:0852
Alex Clarke831ed1e62019-02-18 21:10:0853 private:
54 friend class BrowserTaskExecutor;
55
Scott Haseley20ccbe322023-04-26 20:25:1456 using QueueEnabledVoter =
57 base::sequence_manager::TaskQueue::QueueEnabledVoter;
58
Etienne Pierre-doray40545ac2021-11-11 13:34:2859 explicit BrowserUIThreadScheduler(
60 base::sequence_manager::SequenceManager* sequence_manager);
Alex Clarke831ed1e62019-02-18 21:10:0861
Carlos Caballero5f6212b2019-05-13 13:45:1662 void CommonSequenceManagerSetup(
63 base::sequence_manager::SequenceManager* sequence_manager);
Alex Clarke831ed1e62019-02-18 21:10:0864
mikt541ac712025-08-04 03:16:2265 // Reads a feature list; need to be called after its initialization.
66 void InstallPartitionAllocSchedulerLoopQuarantineTaskObserver();
67
Anand Ravi5e3bf102025-05-02 15:24:4968 void OnTaskCompleted(
69 const base::sequence_manager::Task& task,
70 base::sequence_manager::TaskQueue::TaskTiming* task_timing,
71 base::LazyNow* lazy_now);
72
Alex Clarke831ed1e62019-02-18 21:10:0873 // In production the BrowserUIThreadScheduler will own its SequenceManager,
74 // but in tests it may not.
75 std::unique_ptr<base::sequence_manager::SequenceManager>
76 owned_sequence_manager_;
77
Carlos Caballero5f6212b2019-05-13 13:45:1678 BrowserTaskQueues task_queues_;
mikt541ac712025-08-04 03:16:2279 SchedulerLoopQuarantineTaskObserver scheduler_loop_quarantine_task_observer_;
Omar Elmekkawyb081b583a2022-12-17 13:01:2780
Alex Clarke49854cc2019-06-27 08:25:4981 scoped_refptr<Handle> handle_;
Alex Clarke831ed1e62019-02-18 21:10:0882};
83
84} // namespace content
85
86#endif // CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_