Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 2 | // 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 Nowierski | f5eeeba | 2024-01-25 12:49:39 | [diff] [blame] | 10 | #include "base/memory/raw_ptr.h" |
Carlos Caballero | c472c2bf | 2019-04-18 09:30:36 | [diff] [blame] | 11 | #include "base/task/sequence_manager/task_queue.h" |
Gabriel Charette | d87f10f | 2022-03-31 00:44:22 | [diff] [blame] | 12 | #include "base/time/time.h" |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 13 | #include "content/browser/scheduler/browser_task_queues.h" |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 14 | #include "content/common/content_export.h" |
mikt | 541ac71 | 2025-08-04 03:16:22 | [diff] [blame] | 15 | #include "content/common/scheduler_loop_quarantine_task_observer.h" |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 16 | |
| 17 | namespace base { |
| 18 | namespace sequence_manager { |
| 19 | class SequenceManager; |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 20 | } // namespace sequence_manager |
| 21 | } // namespace base |
| 22 | |
| 23 | namespace content { |
| 24 | class BrowserTaskExecutor; |
| 25 | |
| 26 | // The BrowserUIThreadScheduler vends TaskQueues and manipulates them to |
| 27 | // implement scheduling policy. This class is never deleted in production. |
| 28 | class CONTENT_EXPORT BrowserUIThreadScheduler { |
| 29 | public: |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 30 | using Handle = BrowserTaskQueues::Handle; |
| 31 | |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 32 | BrowserUIThreadScheduler(); |
Peter Boström | 9b03653 | 2021-10-28 23:37:28 | [diff] [blame] | 33 | |
| 34 | BrowserUIThreadScheduler(const BrowserUIThreadScheduler&) = delete; |
| 35 | BrowserUIThreadScheduler& operator=(const BrowserUIThreadScheduler&) = delete; |
| 36 | |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 37 | ~BrowserUIThreadScheduler(); |
| 38 | |
Stephen Nusko | 408b9a9 | 2022-09-15 10:03:57 | [diff] [blame] | 39 | static BrowserUIThreadScheduler* Get(); |
| 40 | |
mikt | 541ac71 | 2025-08-04 03:16:22 | [diff] [blame] | 41 | // 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 Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 45 | // Setting the DefaultTaskRunner is up to the caller. |
| 46 | static std::unique_ptr<BrowserUIThreadScheduler> CreateForTesting( |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 47 | base::sequence_manager::SequenceManager* sequence_manager); |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 48 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 49 | using QueueType = BrowserTaskQueues::QueueType; |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 50 | |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 51 | scoped_refptr<Handle> GetHandle() const { return handle_; } |
Carlos Caballero | ff8c503 | 2019-04-01 11:15:08 | [diff] [blame] | 52 | |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 53 | private: |
| 54 | friend class BrowserTaskExecutor; |
| 55 | |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 56 | using QueueEnabledVoter = |
| 57 | base::sequence_manager::TaskQueue::QueueEnabledVoter; |
| 58 | |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 59 | explicit BrowserUIThreadScheduler( |
| 60 | base::sequence_manager::SequenceManager* sequence_manager); |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 61 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 62 | void CommonSequenceManagerSetup( |
| 63 | base::sequence_manager::SequenceManager* sequence_manager); |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 64 | |
mikt | 541ac71 | 2025-08-04 03:16:22 | [diff] [blame] | 65 | // Reads a feature list; need to be called after its initialization. |
| 66 | void InstallPartitionAllocSchedulerLoopQuarantineTaskObserver(); |
| 67 | |
Anand Ravi | 5e3bf10 | 2025-05-02 15:24:49 | [diff] [blame] | 68 | void OnTaskCompleted( |
| 69 | const base::sequence_manager::Task& task, |
| 70 | base::sequence_manager::TaskQueue::TaskTiming* task_timing, |
| 71 | base::LazyNow* lazy_now); |
| 72 | |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 73 | // 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 Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 78 | BrowserTaskQueues task_queues_; |
mikt | 541ac71 | 2025-08-04 03:16:22 | [diff] [blame] | 79 | SchedulerLoopQuarantineTaskObserver scheduler_loop_quarantine_task_observer_; |
Omar Elmekkawy | b081b583a | 2022-12-17 13:01:27 | [diff] [blame] | 80 | |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 81 | scoped_refptr<Handle> handle_; |
Alex Clarke | 831ed1e6 | 2019-02-18 21:10:08 | [diff] [blame] | 82 | }; |
| 83 | |
| 84 | } // namespace content |
| 85 | |
| 86 | #endif // CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_ |