Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [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 | #include "content/browser/scheduler/browser_task_queues.h" |
| 6 | |
| 7 | #include <iterator> |
| 8 | |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 9 | #include "base/check.h" |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 10 | #include "base/feature_list.h" |
Avi Drissman | adac2199 | 2023-01-11 23:46:39 | [diff] [blame] | 11 | #include "base/functional/bind.h" |
| 12 | #include "base/functional/callback_helpers.h" |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 13 | #include "base/memory/scoped_refptr.h" |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 14 | #include "base/task/sequence_manager/sequence_manager.h" |
Patrick Monette | 643cdf6 | 2021-10-15 19:13:42 | [diff] [blame] | 15 | #include "base/task/sequenced_task_runner.h" |
Sean Maher | e672a66 | 2023-01-09 21:42:28 | [diff] [blame] | 16 | #include "base/task/single_thread_task_runner.h" |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 17 | #include "content/browser/scheduler/browser_task_priority.h" |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 18 | #include "content/public/browser/browser_thread.h" |
| 19 | #include "content/public/common/content_features.h" |
| 20 | |
| 21 | namespace content { |
| 22 | namespace { |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 23 | |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 24 | using BrowserTaskPriority = ::content::internal::BrowserTaskPriority; |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 25 | using QueueName = ::perfetto::protos::pbzero::SequenceManagerTask::QueueName; |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 26 | using InsertFencePosition = |
| 27 | ::base::sequence_manager::TaskQueue::InsertFencePosition; |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 28 | using QueueEnabledVoter = base::sequence_manager::TaskQueue::QueueEnabledVoter; |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 29 | |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 30 | QueueName GetControlTaskQueueName(BrowserThread::ID thread_id) { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 31 | switch (thread_id) { |
| 32 | case BrowserThread::UI: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 33 | return QueueName::UI_CONTROL_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 34 | case BrowserThread::IO: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 35 | return QueueName::IO_CONTROL_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 36 | case BrowserThread::ID_COUNT: |
| 37 | break; |
| 38 | } |
Peter Boström | fc7ddc18 | 2024-10-31 19:37:21 | [diff] [blame] | 39 | NOTREACHED(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 40 | } |
| 41 | |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 42 | QueueName GetRunAllPendingTaskQueueName(BrowserThread::ID thread_id) { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 43 | switch (thread_id) { |
| 44 | case BrowserThread::UI: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 45 | return QueueName::UI_RUN_ALL_PENDING_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 46 | case BrowserThread::IO: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 47 | return QueueName::IO_RUN_ALL_PENDING_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 48 | case BrowserThread::ID_COUNT: |
| 49 | break; |
| 50 | } |
Peter Boström | fc7ddc18 | 2024-10-31 19:37:21 | [diff] [blame] | 51 | NOTREACHED(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 52 | } |
| 53 | |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 54 | QueueName GetUITaskQueueName(BrowserTaskQueues::QueueType queue_type) { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 55 | switch (queue_type) { |
| 56 | case BrowserTaskQueues::QueueType::kBestEffort: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 57 | return QueueName::UI_BEST_EFFORT_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 58 | case BrowserTaskQueues::QueueType::kDefault: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 59 | return QueueName::UI_DEFAULT_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 60 | case BrowserTaskQueues::QueueType::kUserBlocking: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 61 | return QueueName::UI_USER_BLOCKING_TQ; |
Alex Clarke | b7eb45c | 2019-07-10 15:19:24 | [diff] [blame] | 62 | case BrowserTaskQueues::QueueType::kUserVisible: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 63 | return QueueName::UI_USER_VISIBLE_TQ; |
Stephen Nusko | d43825b | 2021-06-24 19:10:37 | [diff] [blame] | 64 | case BrowserTaskQueues::QueueType::kUserInput: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 65 | return QueueName::UI_USER_INPUT_TQ; |
Clark DuVall | 6429553c | 2021-10-06 02:53:15 | [diff] [blame] | 66 | case BrowserTaskQueues::QueueType::kNavigationNetworkResponse: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 67 | return QueueName::UI_NAVIGATION_NETWORK_RESPONSE_TQ; |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 68 | case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 69 | return QueueName::UI_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ; |
Ryan Sturm | ac5b166 | 2023-06-13 23:31:47 | [diff] [blame] | 70 | case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse: |
| 71 | return QueueName::UI_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ; |
Chidera Olibie | f6c4cdb | 2025-06-25 22:56:08 | [diff] [blame] | 72 | case BrowserTaskQueues::QueueType::kStartup: |
| 73 | return QueueName::UI_STARTUP_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 74 | } |
| 75 | } |
| 76 | |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 77 | QueueName GetIOTaskQueueName(BrowserTaskQueues::QueueType queue_type) { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 78 | switch (queue_type) { |
| 79 | case BrowserTaskQueues::QueueType::kBestEffort: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 80 | return QueueName::IO_BEST_EFFORT_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 81 | case BrowserTaskQueues::QueueType::kDefault: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 82 | return QueueName::IO_DEFAULT_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 83 | case BrowserTaskQueues::QueueType::kUserBlocking: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 84 | return QueueName::IO_USER_BLOCKING_TQ; |
Alex Clarke | b7eb45c | 2019-07-10 15:19:24 | [diff] [blame] | 85 | case BrowserTaskQueues::QueueType::kUserVisible: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 86 | return QueueName::IO_USER_VISIBLE_TQ; |
Stephen Nusko | d43825b | 2021-06-24 19:10:37 | [diff] [blame] | 87 | case BrowserTaskQueues::QueueType::kUserInput: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 88 | return QueueName::IO_USER_INPUT_TQ; |
Clark DuVall | 6429553c | 2021-10-06 02:53:15 | [diff] [blame] | 89 | case BrowserTaskQueues::QueueType::kNavigationNetworkResponse: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 90 | return QueueName::IO_NAVIGATION_NETWORK_RESPONSE_TQ; |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 91 | case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse: |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 92 | return QueueName::IO_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ; |
Ryan Sturm | ac5b166 | 2023-06-13 23:31:47 | [diff] [blame] | 93 | case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse: |
| 94 | return QueueName::IO_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ; |
Chidera Olibie | f6c4cdb | 2025-06-25 22:56:08 | [diff] [blame] | 95 | case BrowserTaskQueues::QueueType::kStartup: |
| 96 | return QueueName::IO_STARTUP_TQ; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 97 | } |
| 98 | } |
| 99 | |
Aman Verma | 566a5d2 | 2022-09-22 16:30:48 | [diff] [blame] | 100 | QueueName GetTaskQueueName(BrowserThread::ID thread_id, |
| 101 | BrowserTaskQueues::QueueType queue_type) { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 102 | switch (thread_id) { |
| 103 | case BrowserThread::UI: |
| 104 | return GetUITaskQueueName(queue_type); |
| 105 | case BrowserThread::IO: |
| 106 | return GetIOTaskQueueName(queue_type); |
| 107 | case BrowserThread::ID_COUNT: |
| 108 | break; |
| 109 | } |
Peter Boström | fc7ddc18 | 2024-10-31 19:37:21 | [diff] [blame] | 110 | NOTREACHED(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | } // namespace |
| 114 | |
Omar Elmekkawy | b081b583a | 2022-12-17 13:01:27 | [diff] [blame] | 115 | BrowserTaskQueues::QueueData::QueueData() = default; |
| 116 | BrowserTaskQueues::QueueData::~QueueData() = default; |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 117 | BrowserTaskQueues::QueueData::QueueData(BrowserTaskQueues::QueueData&& other) = |
| 118 | default; |
| 119 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 120 | BrowserTaskQueues::Handle::~Handle() = default; |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 121 | |
| 122 | BrowserTaskQueues::Handle::Handle(BrowserTaskQueues* outer) |
| 123 | : outer_(outer), |
| 124 | control_task_runner_(outer_->control_queue_->task_runner()), |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 125 | default_task_runner_(outer_->GetDefaultTaskQueue()->task_runner()), |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 126 | browser_task_runners_(outer_->CreateBrowserTaskRunners()) {} |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 127 | |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 128 | void BrowserTaskQueues::Handle::OnStartupComplete() { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 129 | control_task_runner_->PostTask( |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 130 | FROM_HERE, base::BindOnce(&BrowserTaskQueues::OnStartupComplete, |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 131 | base::Unretained(outer_))); |
| 132 | } |
| 133 | |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 134 | void BrowserTaskQueues::Handle::EnableAllExceptBestEffortQueues() { |
| 135 | control_task_runner_->PostTask( |
| 136 | FROM_HERE, |
| 137 | base::BindOnce(&BrowserTaskQueues::EnableAllExceptBestEffortQueues, |
| 138 | base::Unretained(outer_))); |
| 139 | } |
| 140 | |
Chidera Olibie | debdc54 | 2025-03-25 23:14:08 | [diff] [blame] | 141 | void BrowserTaskQueues::Handle::EnableTaskQueue(QueueType type) { |
| 142 | control_task_runner_->PostTask( |
| 143 | FROM_HERE, base::BindOnce(&BrowserTaskQueues::EnableTaskQueue, |
| 144 | base::Unretained(outer_), type)); |
| 145 | } |
| 146 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 147 | void BrowserTaskQueues::Handle::ScheduleRunAllPendingTasksForTesting( |
| 148 | base::OnceClosure on_pending_task_ran) { |
| 149 | control_task_runner_->PostTask( |
| 150 | FROM_HERE, |
| 151 | base::BindOnce( |
| 152 | &BrowserTaskQueues::StartRunAllPendingTasksForTesting, |
| 153 | base::Unretained(outer_), |
| 154 | base::ScopedClosureRunner(std::move(on_pending_task_ran)))); |
| 155 | } |
| 156 | |
| 157 | BrowserTaskQueues::BrowserTaskQueues( |
| 158 | BrowserThread::ID thread_id, |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 159 | base::sequence_manager::SequenceManager* sequence_manager) { |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 160 | for (size_t i = 0; i < queue_data_.size(); ++i) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 161 | queue_data_[i].task_queue = sequence_manager->CreateTaskQueue( |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 162 | base::sequence_manager::TaskQueue::Spec( |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 163 | GetTaskQueueName(thread_id, static_cast<QueueType>(i)))); |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 164 | queue_data_[i].voter = queue_data_[i].task_queue->CreateQueueEnabledVoter(); |
Chidera Olibie | debdc54 | 2025-03-25 23:14:08 | [diff] [blame] | 165 | queue_data_[i].voter->SetVoteToEnable(false); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 166 | } |
| 167 | |
Alex Clarke | b7eb45c | 2019-07-10 15:19:24 | [diff] [blame] | 168 | GetBrowserTaskQueue(QueueType::kUserVisible) |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 169 | ->SetQueuePriority(BrowserTaskPriority::kLowPriority); |
Alex Clarke | b7eb45c | 2019-07-10 15:19:24 | [diff] [blame] | 170 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 171 | // Best effort queue |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 172 | GetBrowserTaskQueue(QueueType::kBestEffort) |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 173 | ->SetQueuePriority(BrowserTaskPriority::kBestEffortPriority); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 174 | |
Stephen Nusko | d43825b | 2021-06-24 19:10:37 | [diff] [blame] | 175 | // User Input queue |
| 176 | GetBrowserTaskQueue(QueueType::kUserInput) |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 177 | ->SetQueuePriority(BrowserTaskPriority::kHighestPriority); |
Stephen Nusko | d43825b | 2021-06-24 19:10:37 | [diff] [blame] | 178 | |
Clark DuVall | 6429553c | 2021-10-06 02:53:15 | [diff] [blame] | 179 | GetBrowserTaskQueue(QueueType::kNavigationNetworkResponse) |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 180 | ->SetQueuePriority(BrowserTaskPriority::kHighPriority); |
Clark DuVall | 6429553c | 2021-10-06 02:53:15 | [diff] [blame] | 181 | |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 182 | GetBrowserTaskQueue(QueueType::kServiceWorkerStorageControlResponse) |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 183 | ->SetQueuePriority(BrowserTaskPriority::kHighestPriority); |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 184 | |
Ryan Sturm | ac5b166 | 2023-06-13 23:31:47 | [diff] [blame] | 185 | GetBrowserTaskQueue(QueueType::kBeforeUnloadBrowserResponse) |
| 186 | ->SetQueuePriority(BrowserTaskPriority::kHighPriority); |
| 187 | |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 188 | // Control queue |
| 189 | control_queue_ = |
| 190 | sequence_manager->CreateTaskQueue(base::sequence_manager::TaskQueue::Spec( |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 191 | GetControlTaskQueueName(thread_id))); |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 192 | control_queue_->SetQueuePriority(BrowserTaskPriority::kControlPriority); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 193 | |
| 194 | // Run all pending queue |
Etienne Pierre-doray | 40545ac | 2021-11-11 13:34:28 | [diff] [blame] | 195 | run_all_pending_tasks_queue_ = |
| 196 | sequence_manager->CreateTaskQueue(base::sequence_manager::TaskQueue::Spec( |
| 197 | GetRunAllPendingTaskQueueName(thread_id))); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 198 | run_all_pending_tasks_queue_->SetQueuePriority( |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 199 | BrowserTaskPriority::kBestEffortPriority); |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 200 | |
| 201 | handle_ = base::AdoptRef(new Handle(this)); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | BrowserTaskQueues::~BrowserTaskQueues() { |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 205 | for (auto& queue : queue_data_) { |
Scott Haseley | f473cfeba | 2023-09-21 16:01:47 | [diff] [blame] | 206 | queue.task_queue.reset(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 207 | } |
Scott Haseley | f473cfeba | 2023-09-21 16:01:47 | [diff] [blame] | 208 | control_queue_.reset(); |
| 209 | run_all_pending_tasks_queue_.reset(); |
Tom Sepez | a80667c | 2023-02-13 19:18:46 | [diff] [blame] | 210 | handle_->OnTaskQueuesDestroyed(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 211 | } |
| 212 | |
| 213 | std::array<scoped_refptr<base::SingleThreadTaskRunner>, |
| 214 | BrowserTaskQueues::kNumQueueTypes> |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 215 | BrowserTaskQueues::CreateBrowserTaskRunners() const { |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 216 | std::array<scoped_refptr<base::SingleThreadTaskRunner>, kNumQueueTypes> |
| 217 | task_runners; |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 218 | for (size_t i = 0; i < queue_data_.size(); ++i) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 219 | task_runners[i] = queue_data_[i].task_queue->task_runner(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 220 | } |
| 221 | return task_runners; |
| 222 | } |
| 223 | |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 224 | void BrowserTaskQueues::OnStartupComplete() { |
| 225 | // Enable all queues |
| 226 | for (const auto& queue : queue_data_) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 227 | queue.voter->SetVoteToEnable(true); |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 228 | } |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 229 | |
| 230 | // Update ServiceWorker task queue priority. |
Scott Haseley | 72d89b0 | 2023-02-17 03:29:25 | [diff] [blame] | 231 | DCHECK_EQ( |
| 232 | static_cast<BrowserTaskPriority>( |
| 233 | GetBrowserTaskQueue(QueueType::kServiceWorkerStorageControlResponse) |
| 234 | ->GetQueuePriority()), |
| 235 | BrowserTaskPriority::kHighestPriority); |
Minoru Chikamune | a031756 | 2022-03-22 15:30:21 | [diff] [blame] | 236 | GetBrowserTaskQueue(QueueType::kServiceWorkerStorageControlResponse) |
Nathan Memmott | a9eec54 | 2024-12-13 18:17:28 | [diff] [blame] | 237 | ->SetQueuePriority(BrowserTaskPriority::kHighPriority); |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 238 | } |
| 239 | |
Chidera Olibie | debdc54 | 2025-03-25 23:14:08 | [diff] [blame] | 240 | void BrowserTaskQueues::EnableTaskQueue(QueueType type) { |
| 241 | queue_data_[static_cast<size_t>(type)].voter->SetVoteToEnable(true); |
| 242 | } |
| 243 | |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 244 | void BrowserTaskQueues::EnableAllExceptBestEffortQueues() { |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 245 | for (size_t i = 0; i < queue_data_.size(); ++i) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 246 | if (i != static_cast<size_t>(QueueType::kBestEffort)) { |
| 247 | queue_data_[i].voter->SetVoteToEnable(true); |
| 248 | } |
Carlos Caballero | 72e8a20 | 2019-05-21 16:51:17 | [diff] [blame] | 249 | } |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 250 | } |
| 251 | |
| 252 | // To run all pending tasks we do the following. We insert a fence in all queues |
| 253 | // and post a task to the |run_all_pending_queue_| which has the lowest priority |
| 254 | // possible. That makes sure that all tasks up to the fences will have run |
| 255 | // before this posted task runs. Note that among tasks with the same priority |
| 256 | // ties are broken by using the enqueue order, so all prior best effort tasks |
| 257 | // will have run before this one does. This task will then remove all the fences |
| 258 | // and call the user provided callback to signal that all pending tasks have |
| 259 | // run. This method is "reentrant" as in we can call it multiple times as the |
| 260 | // fences will just be moved back, but we need to make sure that only the last |
| 261 | // call removes the fences, for that we keep track of "nesting" with |
| 262 | // |run_all_pending_nesting_level_| |
| 263 | void BrowserTaskQueues::StartRunAllPendingTasksForTesting( |
| 264 | base::ScopedClosureRunner on_pending_task_ran) { |
| 265 | ++run_all_pending_nesting_level_; |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 266 | for (const auto& queue : queue_data_) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 267 | queue.task_queue->InsertFence(InsertFencePosition::kNow); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 268 | } |
| 269 | run_all_pending_tasks_queue_->task_runner()->PostTask( |
| 270 | FROM_HERE, |
| 271 | base::BindOnce(&BrowserTaskQueues::EndRunAllPendingTasksForTesting, |
| 272 | base::Unretained(this), std::move(on_pending_task_ran))); |
| 273 | } |
| 274 | |
| 275 | void BrowserTaskQueues::EndRunAllPendingTasksForTesting( |
| 276 | base::ScopedClosureRunner on_pending_task_ran) { |
| 277 | --run_all_pending_nesting_level_; |
| 278 | if (run_all_pending_nesting_level_ == 0) { |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 279 | for (const auto& queue : queue_data_) { |
Scott Haseley | 20ccbe32 | 2023-04-26 20:25:14 | [diff] [blame] | 280 | queue.task_queue->RemoveFence(); |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 281 | } |
Carlos Caballero | 5f6212b | 2019-05-13 13:45:16 | [diff] [blame] | 282 | } |
| 283 | } |
| 284 | |
Anand Ravi | 5e3bf10 | 2025-05-02 15:24:49 | [diff] [blame] | 285 | void BrowserTaskQueues::SetOnTaskCompletedHandler( |
| 286 | base::sequence_manager::TaskQueue::OnTaskCompletedHandler handler) { |
| 287 | for (auto& queue : queue_data_) { |
| 288 | queue.task_queue->SetOnTaskCompletedHandler(handler); |
| 289 | } |
| 290 | } |
| 291 | |
mikt | 541ac71 | 2025-08-04 03:16:22 | [diff] [blame] | 292 | void BrowserTaskQueues::AddTaskObserver(base::TaskObserver* task_observer) { |
| 293 | for (const auto& queue : queue_data_) { |
| 294 | queue.task_queue->AddTaskObserver(task_observer); |
| 295 | } |
| 296 | } |
| 297 | |
Alex Clarke | 49854cc | 2019-06-27 08:25:49 | [diff] [blame] | 298 | } // namespace content |