Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [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 | |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 5 | #ifndef CONTENT_BROWSER_SCHEDULER_BROWSER_IO_THREAD_DELEGATE_H_ |
| 6 | #define CONTENT_BROWSER_SCHEDULER_BROWSER_IO_THREAD_DELEGATE_H_ |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 7 | |
| 8 | #include "base/memory/ptr_util.h" |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 9 | #include "base/memory/raw_ptr.h" |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 10 | #include "base/memory/scoped_refptr.h" |
| 11 | #include "base/task/sequence_manager/task_queue.h" |
| 12 | #include "base/threading/thread.h" |
Gabriel Charette | d87f10f | 2022-03-31 00:44:22 | [diff] [blame] | 13 | #include "base/time/time.h" |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 14 | #include "content/browser/scheduler/browser_task_queues.h" |
| 15 | #include "content/common/content_export.h" |
| 16 | |
| 17 | namespace base { |
| 18 | class SingleThreadTaskRunner; |
| 19 | |
| 20 | namespace sequence_manager { |
| 21 | class SequenceManager; |
| 22 | } // namespace sequence_manager |
| 23 | |
| 24 | } // namespace base |
| 25 | |
| 26 | namespace content { |
| 27 | |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 28 | // Delegate for the IO thread. |
| 29 | class CONTENT_EXPORT BrowserIOThreadDelegate : public base::Thread::Delegate { |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 30 | public: |
| 31 | using Handle = BrowserTaskQueues::Handle; |
| 32 | |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 33 | // Creates a BrowserIOThreadDelegate for use with a real IO thread. |
| 34 | BrowserIOThreadDelegate(); |
| 35 | ~BrowserIOThreadDelegate() override; |
Karolina Soltys | b083f93 | 2019-09-25 16:18:06 | [diff] [blame] | 36 | |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 37 | static std::unique_ptr<BrowserIOThreadDelegate> CreateForTesting( |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 38 | base::sequence_manager::SequenceManager* sequence_manager) { |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 39 | DCHECK(sequence_manager); |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 40 | return base::WrapUnique(new BrowserIOThreadDelegate(sequence_manager)); |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 41 | } |
| 42 | |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 43 | scoped_refptr<base::SingleThreadTaskRunner> GetDefaultTaskRunner() override; |
Etienne Pierre-doray | ef5dcca | 2023-07-11 16:46:27 | [diff] [blame] | 44 | void BindToCurrentThread() override; |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 45 | |
Jiahe Zhang | 93e2eda | 2025-07-16 03:32:34 | [diff] [blame] | 46 | void AddTaskObserver(base::TaskObserver* observer) override; |
| 47 | |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 48 | bool allow_blocking_for_testing() const { |
| 49 | return allow_blocking_for_testing_; |
| 50 | } |
| 51 | |
| 52 | // Call this before handing this over to a base::Thread to allow blocking in |
| 53 | // tests. |
| 54 | void SetAllowBlockingForTesting() { allow_blocking_for_testing_ = true; } |
| 55 | |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 56 | scoped_refptr<Handle> GetHandle() { return task_queues_->GetHandle(); } |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 57 | |
| 58 | private: |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 59 | // Creates a sequence funneled BrowserIOThreadDelegate for use in testing. |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 60 | explicit BrowserIOThreadDelegate( |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 61 | base::sequence_manager::SequenceManager* sequence_manager); |
| 62 | |
| 63 | // Performs the actual initialization of all the members that require a |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 64 | // SequenceManager. |
| 65 | void Init(); |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 66 | |
| 67 | bool allow_blocking_for_testing_ = false; |
| 68 | // Owned SequenceManager, null if instance created via CreateForTesting. |
Alex Clarke | bbf891dc | 2019-10-09 14:18:02 | [diff] [blame] | 69 | const std::unique_ptr<base::sequence_manager::SequenceManager> |
| 70 | owned_sequence_manager_; |
| 71 | |
Keishi Hattori | 0e45c02 | 2021-11-27 09:25:52 | [diff] [blame] | 72 | const raw_ptr<base::sequence_manager::SequenceManager> sequence_manager_; |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 73 | |
| 74 | std::unique_ptr<BrowserTaskQueues> task_queues_; |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 75 | scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
Karolina Soltys | 1e76b45 | 2019-08-22 20:35:07 | [diff] [blame] | 76 | }; |
Findit | 30f71a7 | 2019-08-22 22:02:01 | [diff] [blame] | 77 | |
Carlos Caballero | e840fc3 | 2019-05-27 14:16:37 | [diff] [blame] | 78 | } // namespace content |
| 79 | |
Gabriel Charette | 748577aa | 2019-08-12 12:53:55 | [diff] [blame] | 80 | #endif // CONTENT_BROWSER_SCHEDULER_BROWSER_IO_THREAD_DELEGATE_H_ |