| Avi Drissman | e4622aa | 2022-09-08 20:36:06 | [diff] [blame] | 1 | // Copyright 2018 The Chromium Authors |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [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 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 5 | #include "base/task/current_thread.h" |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 6 | |
| Jan Keitel | 748d58e0 | 2024-01-19 21:55:38 | [diff] [blame] | 7 | #include <utility> |
| 8 | |
| 9 | #include "base/callback_list.h" |
| Avi Drissman | 63e1f99 | 2023-01-13 18:54:43 | [diff] [blame] | 10 | #include "base/functional/bind.h" |
| 11 | #include "base/functional/callback.h" |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 12 | #include "base/message_loop/message_pump_for_io.h" |
| 13 | #include "base/message_loop/message_pump_for_ui.h" |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 14 | #include "base/message_loop/message_pump_type.h" |
| Carlos Caballero | 128dc1f1 | 2019-03-20 10:46:11 | [diff] [blame] | 15 | #include "base/task/sequence_manager/sequence_manager_impl.h" |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 16 | #include "base/threading/thread_local.h" |
| Etienne Pierre-doray | fc7952f0 | 2025-06-06 00:04:33 | [diff] [blame] | 17 | #include "base/trace_event/trace_event.h" |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 18 | #include "build/build_config.h" |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 19 | |
| 20 | namespace base { |
| 21 | |
| 22 | //------------------------------------------------------------------------------ |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 23 | // CurrentThread |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 24 | |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 25 | // static |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 26 | sequence_manager::internal::SequenceManagerImpl* |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 27 | CurrentThread::GetCurrentSequenceManagerImpl() { |
| Carlos Caballero | 128dc1f1 | 2019-03-20 10:46:11 | [diff] [blame] | 28 | return sequence_manager::internal::SequenceManagerImpl::GetCurrent(); |
| 29 | } |
| 30 | |
| 31 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 32 | CurrentThread CurrentThread::Get() { |
| 33 | return CurrentThread(GetCurrentSequenceManagerImpl()); |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 37 | CurrentThread CurrentThread::GetNull() { |
| 38 | return CurrentThread(nullptr); |
| Alexander Timin | 35cc330 | 2018-10-31 18:54:49 | [diff] [blame] | 39 | } |
| 40 | |
| 41 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 42 | bool CurrentThread::IsSet() { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 43 | return !!GetCurrentSequenceManagerImpl(); |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 44 | } |
| 45 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 46 | void CurrentThread::AddDestructionObserver( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 47 | DestructionObserver* destruction_observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 48 | DCHECK(current_->IsBoundToCurrentThread()); |
| 49 | current_->AddDestructionObserver(destruction_observer); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 50 | } |
| 51 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 52 | void CurrentThread::RemoveDestructionObserver( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 53 | DestructionObserver* destruction_observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 54 | DCHECK(current_->IsBoundToCurrentThread()); |
| 55 | current_->RemoveDestructionObserver(destruction_observer); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 56 | } |
| 57 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 58 | void CurrentThread::SetTaskRunner( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 59 | scoped_refptr<SingleThreadTaskRunner> task_runner) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 60 | DCHECK(current_->IsBoundToCurrentThread()); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 61 | current_->SetTaskRunner(std::move(task_runner)); |
| 62 | } |
| 63 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 64 | bool CurrentThread::IsBoundToCurrentThread() const { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 65 | return current_ == GetCurrentSequenceManagerImpl(); |
| Alexander Timin | d1e773cb | 2018-10-26 14:19:03 | [diff] [blame] | 66 | } |
| 67 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 68 | bool CurrentThread::IsIdleForTesting() { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 69 | DCHECK(current_->IsBoundToCurrentThread()); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 70 | return current_->IsIdleForTesting(); |
| 71 | } |
| 72 | |
| Gabriel Charette | 5dd30f1 | 2022-07-09 15:14:22 | [diff] [blame] | 73 | void CurrentThread::EnableMessagePumpTimeKeeperMetrics( |
| henrika | 3cee59b | 2024-05-03 16:20:52 | [diff] [blame] | 74 | const char* thread_name, |
| 75 | bool wall_time_based_metrics_enabled_for_testing) { |
| 76 | return current_->EnableMessagePumpTimeKeeperMetrics( |
| 77 | thread_name, wall_time_based_metrics_enabled_for_testing); |
| Gabriel Charette | 5dd30f1 | 2022-07-09 15:14:22 | [diff] [blame] | 78 | } |
| 79 | |
| Ken Rockot | 2276a61 | 2024-11-22 23:08:44 | [diff] [blame] | 80 | IOWatcher* CurrentThread::GetIOWatcher() { |
| 81 | DCHECK(current_->IsBoundToCurrentThread()); |
| 82 | return current_->GetMessagePump()->GetIOWatcher(); |
| 83 | } |
| 84 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 85 | void CurrentThread::AddTaskObserver(TaskObserver* task_observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 86 | DCHECK(current_->IsBoundToCurrentThread()); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 87 | current_->AddTaskObserver(task_observer); |
| 88 | } |
| 89 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 90 | void CurrentThread::RemoveTaskObserver(TaskObserver* task_observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 91 | DCHECK(current_->IsBoundToCurrentThread()); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 92 | current_->RemoveTaskObserver(task_observer); |
| 93 | } |
| 94 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 95 | void CurrentThread::SetAddQueueTimeToTasks(bool enable) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 96 | DCHECK(current_->IsBoundToCurrentThread()); |
| Erik Chen | a9533519 | 2018-07-30 17:48:22 | [diff] [blame] | 97 | current_->SetAddQueueTimeToTasks(enable); |
| 98 | } |
| 99 | |
| Jan Keitel | 748d58e0 | 2024-01-19 21:55:38 | [diff] [blame] | 100 | CallbackListSubscription CurrentThread::RegisterOnNextIdleCallback( |
| 101 | RegisterOnNextIdleCallbackPasskey, |
| Gabriel Charette | a2232cce | 2021-12-01 01:00:18 | [diff] [blame] | 102 | OnceClosure on_next_idle_callback) { |
| Jan Keitel | 748d58e0 | 2024-01-19 21:55:38 | [diff] [blame] | 103 | return current_->RegisterOnNextIdleCallback(std::move(on_next_idle_callback)); |
| Gabriel Charette | a2232cce | 2021-12-01 01:00:18 | [diff] [blame] | 104 | } |
| 105 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 106 | CurrentThread::ScopedAllowApplicationTasksInNativeNestedLoop:: |
| Gabriel Charette | 69e7ddc5 | 2020-06-04 17:42:12 | [diff] [blame] | 107 | ScopedAllowApplicationTasksInNativeNestedLoop() |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 108 | : sequence_manager_(GetCurrentSequenceManagerImpl()), |
| Sean Maher | e5d5f693 | 2024-04-04 18:07:33 | [diff] [blame] | 109 | previous_state_( |
| 110 | sequence_manager_->IsTaskExecutionAllowedInNativeNestedLoop()) { |
| Gabriel Charette | b1c3f2d | 2020-05-29 20:16:37 | [diff] [blame] | 111 | TRACE_EVENT_BEGIN0("base", "ScopedNestableTaskAllower"); |
| Sean Maher | e5d5f693 | 2024-04-04 18:07:33 | [diff] [blame] | 112 | sequence_manager_->SetTaskExecutionAllowedInNativeNestedLoop(true); |
| Gabriel Charette | c25437c6 | 2018-04-17 00:48:44 | [diff] [blame] | 113 | } |
| 114 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 115 | CurrentThread::ScopedAllowApplicationTasksInNativeNestedLoop:: |
| Gabriel Charette | 69e7ddc5 | 2020-06-04 17:42:12 | [diff] [blame] | 116 | ~ScopedAllowApplicationTasksInNativeNestedLoop() { |
| Sean Maher | e5d5f693 | 2024-04-04 18:07:33 | [diff] [blame] | 117 | sequence_manager_->SetTaskExecutionAllowedInNativeNestedLoop(previous_state_); |
| Gabriel Charette | b1c3f2d | 2020-05-29 20:16:37 | [diff] [blame] | 118 | TRACE_EVENT_END0("base", "ScopedNestableTaskAllower"); |
| Gabriel Charette | c25437c6 | 2018-04-17 00:48:44 | [diff] [blame] | 119 | } |
| 120 | |
| Gabriel Charette | 0e02a9a | 2022-12-13 23:10:54 | [diff] [blame] | 121 | bool CurrentThread::ApplicationTasksAllowedInNativeNestedLoop() const { |
| Sean Maher | e5d5f693 | 2024-04-04 18:07:33 | [diff] [blame] | 122 | return current_->IsTaskExecutionAllowedInNativeNestedLoop(); |
| Gabriel Charette | bdbb58e7 | 2020-06-03 18:26:06 | [diff] [blame] | 123 | } |
| 124 | |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 125 | //------------------------------------------------------------------------------ |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 126 | // CurrentUIThread |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 127 | |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 128 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 129 | CurrentUIThread CurrentUIThread::Get() { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 130 | auto* sequence_manager = GetCurrentSequenceManagerImpl(); |
| 131 | DCHECK(sequence_manager); |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 132 | #if BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 133 | DCHECK(sequence_manager->IsType(MessagePumpType::UI) || |
| 134 | sequence_manager->IsType(MessagePumpType::JAVA)); |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 135 | #else // BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 136 | DCHECK(sequence_manager->IsType(MessagePumpType::UI)); |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 137 | #endif // BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 138 | return CurrentUIThread(sequence_manager); |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 139 | } |
| 140 | |
| 141 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 142 | bool CurrentUIThread::IsSet() { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 143 | sequence_manager::internal::SequenceManagerImpl* sequence_manager = |
| 144 | GetCurrentSequenceManagerImpl(); |
| 145 | return sequence_manager && |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 146 | #if BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 147 | (sequence_manager->IsType(MessagePumpType::UI) || |
| 148 | sequence_manager->IsType(MessagePumpType::JAVA)); |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 149 | #else // BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 150 | sequence_manager->IsType(MessagePumpType::UI); |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 151 | #endif // BUILDFLAG(IS_ANDROID) |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 152 | } |
| 153 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 154 | MessagePumpForUI* CurrentUIThread::GetMessagePumpForUI() const { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 155 | return static_cast<MessagePumpForUI*>(current_->GetMessagePump()); |
| 156 | } |
| 157 | |
| kylechar | dda7bc0 | 2022-10-26 20:34:15 | [diff] [blame] | 158 | #if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_WIN) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 159 | bool CurrentUIThread::WatchFileDescriptor( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 160 | int fd, |
| 161 | bool persistent, |
| 162 | MessagePumpForUI::Mode mode, |
| 163 | MessagePumpForUI::FdWatchController* controller, |
| 164 | MessagePumpForUI::FdWatcher* delegate) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 165 | DCHECK(current_->IsBoundToCurrentThread()); |
| 166 | return GetMessagePumpForUI()->WatchFileDescriptor(fd, persistent, mode, |
| 167 | controller, delegate); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 168 | } |
| 169 | #endif |
| 170 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 171 | #if BUILDFLAG(IS_IOS) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 172 | void CurrentUIThread::Attach() { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 173 | current_->AttachToMessagePump(); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 174 | } |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 175 | #endif // BUILDFLAG(IS_IOS) |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 176 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 177 | #if BUILDFLAG(IS_ANDROID) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 178 | void CurrentUIThread::Abort() { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 179 | GetMessagePumpForUI()->Abort(); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 180 | } |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 181 | #endif // BUILDFLAG(IS_ANDROID) |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 182 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 183 | #if BUILDFLAG(IS_WIN) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 184 | void CurrentUIThread::AddMessagePumpObserver( |
| Erik Chen | d5c6237 | 2018-08-10 20:48:41 | [diff] [blame] | 185 | MessagePumpForUI::Observer* observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 186 | GetMessagePumpForUI()->AddObserver(observer); |
| Erik Chen | d5c6237 | 2018-08-10 20:48:41 | [diff] [blame] | 187 | } |
| 188 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 189 | void CurrentUIThread::RemoveMessagePumpObserver( |
| Erik Chen | d5c6237 | 2018-08-10 20:48:41 | [diff] [blame] | 190 | MessagePumpForUI::Observer* observer) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 191 | GetMessagePumpForUI()->RemoveObserver(observer); |
| Erik Chen | d5c6237 | 2018-08-10 20:48:41 | [diff] [blame] | 192 | } |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 193 | #endif // BUILDFLAG(IS_WIN) |
| Erik Chen | d5c6237 | 2018-08-10 20:48:41 | [diff] [blame] | 194 | |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 195 | //------------------------------------------------------------------------------ |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 196 | // CurrentIOThread |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 197 | |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 198 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 199 | CurrentIOThread CurrentIOThread::Get() { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 200 | auto* sequence_manager = GetCurrentSequenceManagerImpl(); |
| 201 | DCHECK(sequence_manager); |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 202 | DCHECK(sequence_manager->IsType(MessagePumpType::IO)); |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 203 | return CurrentIOThread(sequence_manager); |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 204 | } |
| 205 | |
| 206 | // static |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 207 | bool CurrentIOThread::IsSet() { |
| Carlos Caballero | 14712af9 | 2019-04-17 16:13:01 | [diff] [blame] | 208 | auto* sequence_manager = GetCurrentSequenceManagerImpl(); |
| Carlos Caballero | dd8bf7b04 | 2019-07-30 14:14:15 | [diff] [blame] | 209 | return sequence_manager && sequence_manager->IsType(MessagePumpType::IO); |
| Gabriel Charette | e6bea7b2 | 2018-04-14 03:56:08 | [diff] [blame] | 210 | } |
| 211 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 212 | MessagePumpForIO* CurrentIOThread::GetMessagePumpForIO() const { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 213 | return static_cast<MessagePumpForIO*>(current_->GetMessagePump()); |
| 214 | } |
| 215 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 216 | #if BUILDFLAG(IS_WIN) |
| François Doray | 5b78590 | 2024-11-05 14:32:04 | [diff] [blame] | 217 | bool CurrentIOThread::RegisterIOHandler(HANDLE file, |
| 218 | MessagePumpForIO::IOHandler* handler) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 219 | DCHECK(current_->IsBoundToCurrentThread()); |
| 220 | return GetMessagePumpForIO()->RegisterIOHandler(file, handler); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 221 | } |
| 222 | |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 223 | bool CurrentIOThread::RegisterJobObject(HANDLE job, |
| 224 | MessagePumpForIO::IOHandler* handler) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 225 | DCHECK(current_->IsBoundToCurrentThread()); |
| 226 | return GetMessagePumpForIO()->RegisterJobObject(job, handler); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 227 | } |
| 228 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 229 | #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 230 | bool CurrentIOThread::WatchFileDescriptor( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 231 | int fd, |
| 232 | bool persistent, |
| 233 | MessagePumpForIO::Mode mode, |
| 234 | MessagePumpForIO::FdWatchController* controller, |
| 235 | MessagePumpForIO::FdWatcher* delegate) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 236 | DCHECK(current_->IsBoundToCurrentThread()); |
| 237 | return GetMessagePumpForIO()->WatchFileDescriptor(fd, persistent, mode, |
| 238 | controller, delegate); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 239 | } |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 240 | #endif // BUILDFLAG(IS_WIN) |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 241 | |
| Raphael Kubo da Costa | 50af5a9b | 2025-04-17 21:50:03 | [diff] [blame] | 242 | #if BUILDFLAG(IS_MAC) || \ |
| 243 | (BUILDFLAG(IS_IOS) && !BUILDFLAG(CRONET_BUILD) && !BUILDFLAG(IS_IOS_TVOS)) |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 244 | bool CurrentIOThread::WatchMachReceivePort( |
| Robert Sesek | c96c632 | 2019-02-23 01:26:16 | [diff] [blame] | 245 | mach_port_t port, |
| 246 | MessagePumpForIO::MachPortWatchController* controller, |
| 247 | MessagePumpForIO::MachPortWatcher* delegate) { |
| 248 | DCHECK(current_->IsBoundToCurrentThread()); |
| 249 | return GetMessagePumpForIO()->WatchMachReceivePort(port, controller, |
| 250 | delegate); |
| 251 | } |
| 252 | #endif |
| 253 | |
| Xiaohan Wang | bba17e2 | 2022-01-15 17:58:14 | [diff] [blame] | 254 | #if BUILDFLAG(IS_FUCHSIA) |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 255 | // Additional watch API for native platform resources. |
| Carlos Caballero | 4a05092 | 2020-07-02 11:43:38 | [diff] [blame] | 256 | bool CurrentIOThread::WatchZxHandle( |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 257 | zx_handle_t handle, |
| 258 | bool persistent, |
| 259 | zx_signals_t signals, |
| 260 | MessagePumpForIO::ZxHandleWatchController* controller, |
| 261 | MessagePumpForIO::ZxHandleWatcher* delegate) { |
| Alex Clarke | 605c203 | 2018-11-14 18:46:32 | [diff] [blame] | 262 | DCHECK(current_->IsBoundToCurrentThread()); |
| 263 | return GetMessagePumpForIO()->WatchZxHandle(handle, persistent, signals, |
| 264 | controller, delegate); |
| Gabriel Charette | 01b8301 | 2018-04-13 20:29:35 | [diff] [blame] | 265 | } |
| 266 | #endif |
| 267 | |
| 268 | } // namespace base |