Thanks to visit codestin.com
Credit goes to chromium.googlesource.com

blob: e97435f1705a929ec02848b88b4fe05bdf7399e4 [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2018 The Chromium Authors
Gabriel Charette01b83012018-04-13 20:29:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Carlos Caballero4a050922020-07-02 11:43:385#include "base/task/current_thread.h"
Gabriel Charette01b83012018-04-13 20:29:356
Jan Keitel748d58e02024-01-19 21:55:387#include <utility>
8
9#include "base/callback_list.h"
Avi Drissman63e1f992023-01-13 18:54:4310#include "base/functional/bind.h"
11#include "base/functional/callback.h"
Gabriel Charette01b83012018-04-13 20:29:3512#include "base/message_loop/message_pump_for_io.h"
13#include "base/message_loop/message_pump_for_ui.h"
Carlos Caballerodd8bf7b042019-07-30 14:14:1514#include "base/message_loop/message_pump_type.h"
Carlos Caballero128dc1f12019-03-20 10:46:1115#include "base/task/sequence_manager/sequence_manager_impl.h"
Gabriel Charettee6bea7b22018-04-14 03:56:0816#include "base/threading/thread_local.h"
Etienne Pierre-dorayfc7952f02025-06-06 00:04:3317#include "base/trace_event/trace_event.h"
Xiaohan Wangbba17e22022-01-15 17:58:1418#include "build/build_config.h"
Gabriel Charette01b83012018-04-13 20:29:3519
20namespace base {
21
22//------------------------------------------------------------------------------
Carlos Caballero4a050922020-07-02 11:43:3823// CurrentThread
Gabriel Charette01b83012018-04-13 20:29:3524
Gabriel Charettee6bea7b22018-04-14 03:56:0825// static
Carlos Caballero14712af92019-04-17 16:13:0126sequence_manager::internal::SequenceManagerImpl*
Carlos Caballero4a050922020-07-02 11:43:3827CurrentThread::GetCurrentSequenceManagerImpl() {
Carlos Caballero128dc1f12019-03-20 10:46:1128 return sequence_manager::internal::SequenceManagerImpl::GetCurrent();
29}
30
31// static
Carlos Caballero4a050922020-07-02 11:43:3832CurrentThread CurrentThread::Get() {
33 return CurrentThread(GetCurrentSequenceManagerImpl());
Gabriel Charettee6bea7b22018-04-14 03:56:0834}
35
36// static
Carlos Caballero4a050922020-07-02 11:43:3837CurrentThread CurrentThread::GetNull() {
38 return CurrentThread(nullptr);
Alexander Timin35cc3302018-10-31 18:54:4939}
40
41// static
Carlos Caballero4a050922020-07-02 11:43:3842bool CurrentThread::IsSet() {
Carlos Caballero14712af92019-04-17 16:13:0143 return !!GetCurrentSequenceManagerImpl();
Gabriel Charettee6bea7b22018-04-14 03:56:0844}
45
Carlos Caballero4a050922020-07-02 11:43:3846void CurrentThread::AddDestructionObserver(
Gabriel Charette01b83012018-04-13 20:29:3547 DestructionObserver* destruction_observer) {
Alex Clarke605c2032018-11-14 18:46:3248 DCHECK(current_->IsBoundToCurrentThread());
49 current_->AddDestructionObserver(destruction_observer);
Gabriel Charette01b83012018-04-13 20:29:3550}
51
Carlos Caballero4a050922020-07-02 11:43:3852void CurrentThread::RemoveDestructionObserver(
Gabriel Charette01b83012018-04-13 20:29:3553 DestructionObserver* destruction_observer) {
Alex Clarke605c2032018-11-14 18:46:3254 DCHECK(current_->IsBoundToCurrentThread());
55 current_->RemoveDestructionObserver(destruction_observer);
Gabriel Charette01b83012018-04-13 20:29:3556}
57
Carlos Caballero4a050922020-07-02 11:43:3858void CurrentThread::SetTaskRunner(
Gabriel Charette01b83012018-04-13 20:29:3559 scoped_refptr<SingleThreadTaskRunner> task_runner) {
Alex Clarke605c2032018-11-14 18:46:3260 DCHECK(current_->IsBoundToCurrentThread());
Gabriel Charette01b83012018-04-13 20:29:3561 current_->SetTaskRunner(std::move(task_runner));
62}
63
Carlos Caballero4a050922020-07-02 11:43:3864bool CurrentThread::IsBoundToCurrentThread() const {
Carlos Caballero14712af92019-04-17 16:13:0165 return current_ == GetCurrentSequenceManagerImpl();
Alexander Timind1e773cb2018-10-26 14:19:0366}
67
Carlos Caballero4a050922020-07-02 11:43:3868bool CurrentThread::IsIdleForTesting() {
Alex Clarke605c2032018-11-14 18:46:3269 DCHECK(current_->IsBoundToCurrentThread());
Gabriel Charette01b83012018-04-13 20:29:3570 return current_->IsIdleForTesting();
71}
72
Gabriel Charette5dd30f12022-07-09 15:14:2273void CurrentThread::EnableMessagePumpTimeKeeperMetrics(
henrika3cee59b2024-05-03 16:20:5274 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 Charette5dd30f12022-07-09 15:14:2278}
79
Ken Rockot2276a612024-11-22 23:08:4480IOWatcher* CurrentThread::GetIOWatcher() {
81 DCHECK(current_->IsBoundToCurrentThread());
82 return current_->GetMessagePump()->GetIOWatcher();
83}
84
Carlos Caballero4a050922020-07-02 11:43:3885void CurrentThread::AddTaskObserver(TaskObserver* task_observer) {
Alex Clarke605c2032018-11-14 18:46:3286 DCHECK(current_->IsBoundToCurrentThread());
Gabriel Charette01b83012018-04-13 20:29:3587 current_->AddTaskObserver(task_observer);
88}
89
Carlos Caballero4a050922020-07-02 11:43:3890void CurrentThread::RemoveTaskObserver(TaskObserver* task_observer) {
Alex Clarke605c2032018-11-14 18:46:3291 DCHECK(current_->IsBoundToCurrentThread());
Gabriel Charette01b83012018-04-13 20:29:3592 current_->RemoveTaskObserver(task_observer);
93}
94
Carlos Caballero4a050922020-07-02 11:43:3895void CurrentThread::SetAddQueueTimeToTasks(bool enable) {
Alex Clarke605c2032018-11-14 18:46:3296 DCHECK(current_->IsBoundToCurrentThread());
Erik Chena95335192018-07-30 17:48:2297 current_->SetAddQueueTimeToTasks(enable);
98}
99
Jan Keitel748d58e02024-01-19 21:55:38100CallbackListSubscription CurrentThread::RegisterOnNextIdleCallback(
101 RegisterOnNextIdleCallbackPasskey,
Gabriel Charettea2232cce2021-12-01 01:00:18102 OnceClosure on_next_idle_callback) {
Jan Keitel748d58e02024-01-19 21:55:38103 return current_->RegisterOnNextIdleCallback(std::move(on_next_idle_callback));
Gabriel Charettea2232cce2021-12-01 01:00:18104}
105
Carlos Caballero4a050922020-07-02 11:43:38106CurrentThread::ScopedAllowApplicationTasksInNativeNestedLoop::
Gabriel Charette69e7ddc52020-06-04 17:42:12107 ScopedAllowApplicationTasksInNativeNestedLoop()
Carlos Caballero14712af92019-04-17 16:13:01108 : sequence_manager_(GetCurrentSequenceManagerImpl()),
Sean Mahere5d5f6932024-04-04 18:07:33109 previous_state_(
110 sequence_manager_->IsTaskExecutionAllowedInNativeNestedLoop()) {
Gabriel Charetteb1c3f2d2020-05-29 20:16:37111 TRACE_EVENT_BEGIN0("base", "ScopedNestableTaskAllower");
Sean Mahere5d5f6932024-04-04 18:07:33112 sequence_manager_->SetTaskExecutionAllowedInNativeNestedLoop(true);
Gabriel Charettec25437c62018-04-17 00:48:44113}
114
Carlos Caballero4a050922020-07-02 11:43:38115CurrentThread::ScopedAllowApplicationTasksInNativeNestedLoop::
Gabriel Charette69e7ddc52020-06-04 17:42:12116 ~ScopedAllowApplicationTasksInNativeNestedLoop() {
Sean Mahere5d5f6932024-04-04 18:07:33117 sequence_manager_->SetTaskExecutionAllowedInNativeNestedLoop(previous_state_);
Gabriel Charetteb1c3f2d2020-05-29 20:16:37118 TRACE_EVENT_END0("base", "ScopedNestableTaskAllower");
Gabriel Charettec25437c62018-04-17 00:48:44119}
120
Gabriel Charette0e02a9a2022-12-13 23:10:54121bool CurrentThread::ApplicationTasksAllowedInNativeNestedLoop() const {
Sean Mahere5d5f6932024-04-04 18:07:33122 return current_->IsTaskExecutionAllowedInNativeNestedLoop();
Gabriel Charettebdbb58e72020-06-03 18:26:06123}
124
Gabriel Charette01b83012018-04-13 20:29:35125//------------------------------------------------------------------------------
Carlos Caballero4a050922020-07-02 11:43:38126// CurrentUIThread
Gabriel Charette01b83012018-04-13 20:29:35127
Gabriel Charettee6bea7b22018-04-14 03:56:08128// static
Carlos Caballero4a050922020-07-02 11:43:38129CurrentUIThread CurrentUIThread::Get() {
Carlos Caballero14712af92019-04-17 16:13:01130 auto* sequence_manager = GetCurrentSequenceManagerImpl();
131 DCHECK(sequence_manager);
Xiaohan Wangbba17e22022-01-15 17:58:14132#if BUILDFLAG(IS_ANDROID)
Carlos Caballerodd8bf7b042019-07-30 14:14:15133 DCHECK(sequence_manager->IsType(MessagePumpType::UI) ||
134 sequence_manager->IsType(MessagePumpType::JAVA));
Xiaohan Wangbba17e22022-01-15 17:58:14135#else // BUILDFLAG(IS_ANDROID)
Carlos Caballerodd8bf7b042019-07-30 14:14:15136 DCHECK(sequence_manager->IsType(MessagePumpType::UI));
Xiaohan Wangbba17e22022-01-15 17:58:14137#endif // BUILDFLAG(IS_ANDROID)
Carlos Caballero4a050922020-07-02 11:43:38138 return CurrentUIThread(sequence_manager);
Gabriel Charettee6bea7b22018-04-14 03:56:08139}
140
141// static
Carlos Caballero4a050922020-07-02 11:43:38142bool CurrentUIThread::IsSet() {
Carlos Caballero14712af92019-04-17 16:13:01143 sequence_manager::internal::SequenceManagerImpl* sequence_manager =
144 GetCurrentSequenceManagerImpl();
145 return sequence_manager &&
Xiaohan Wangbba17e22022-01-15 17:58:14146#if BUILDFLAG(IS_ANDROID)
Carlos Caballerodd8bf7b042019-07-30 14:14:15147 (sequence_manager->IsType(MessagePumpType::UI) ||
148 sequence_manager->IsType(MessagePumpType::JAVA));
Xiaohan Wangbba17e22022-01-15 17:58:14149#else // BUILDFLAG(IS_ANDROID)
Carlos Caballerodd8bf7b042019-07-30 14:14:15150 sequence_manager->IsType(MessagePumpType::UI);
Xiaohan Wangbba17e22022-01-15 17:58:14151#endif // BUILDFLAG(IS_ANDROID)
Gabriel Charettee6bea7b22018-04-14 03:56:08152}
153
Carlos Caballero4a050922020-07-02 11:43:38154MessagePumpForUI* CurrentUIThread::GetMessagePumpForUI() const {
Alex Clarke605c2032018-11-14 18:46:32155 return static_cast<MessagePumpForUI*>(current_->GetMessagePump());
156}
157
kylechardda7bc02022-10-26 20:34:15158#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_WIN)
Carlos Caballero4a050922020-07-02 11:43:38159bool CurrentUIThread::WatchFileDescriptor(
Gabriel Charette01b83012018-04-13 20:29:35160 int fd,
161 bool persistent,
162 MessagePumpForUI::Mode mode,
163 MessagePumpForUI::FdWatchController* controller,
164 MessagePumpForUI::FdWatcher* delegate) {
Alex Clarke605c2032018-11-14 18:46:32165 DCHECK(current_->IsBoundToCurrentThread());
166 return GetMessagePumpForUI()->WatchFileDescriptor(fd, persistent, mode,
167 controller, delegate);
Gabriel Charette01b83012018-04-13 20:29:35168}
169#endif
170
Xiaohan Wangbba17e22022-01-15 17:58:14171#if BUILDFLAG(IS_IOS)
Carlos Caballero4a050922020-07-02 11:43:38172void CurrentUIThread::Attach() {
Alex Clarke605c2032018-11-14 18:46:32173 current_->AttachToMessagePump();
Gabriel Charette01b83012018-04-13 20:29:35174}
Xiaohan Wangbba17e22022-01-15 17:58:14175#endif // BUILDFLAG(IS_IOS)
Gabriel Charette01b83012018-04-13 20:29:35176
Xiaohan Wangbba17e22022-01-15 17:58:14177#if BUILDFLAG(IS_ANDROID)
Carlos Caballero4a050922020-07-02 11:43:38178void CurrentUIThread::Abort() {
Alex Clarke605c2032018-11-14 18:46:32179 GetMessagePumpForUI()->Abort();
Gabriel Charette01b83012018-04-13 20:29:35180}
Xiaohan Wangbba17e22022-01-15 17:58:14181#endif // BUILDFLAG(IS_ANDROID)
Gabriel Charette01b83012018-04-13 20:29:35182
Xiaohan Wangbba17e22022-01-15 17:58:14183#if BUILDFLAG(IS_WIN)
Carlos Caballero4a050922020-07-02 11:43:38184void CurrentUIThread::AddMessagePumpObserver(
Erik Chend5c62372018-08-10 20:48:41185 MessagePumpForUI::Observer* observer) {
Alex Clarke605c2032018-11-14 18:46:32186 GetMessagePumpForUI()->AddObserver(observer);
Erik Chend5c62372018-08-10 20:48:41187}
188
Carlos Caballero4a050922020-07-02 11:43:38189void CurrentUIThread::RemoveMessagePumpObserver(
Erik Chend5c62372018-08-10 20:48:41190 MessagePumpForUI::Observer* observer) {
Alex Clarke605c2032018-11-14 18:46:32191 GetMessagePumpForUI()->RemoveObserver(observer);
Erik Chend5c62372018-08-10 20:48:41192}
Xiaohan Wangbba17e22022-01-15 17:58:14193#endif // BUILDFLAG(IS_WIN)
Erik Chend5c62372018-08-10 20:48:41194
Gabriel Charette01b83012018-04-13 20:29:35195//------------------------------------------------------------------------------
Carlos Caballero4a050922020-07-02 11:43:38196// CurrentIOThread
Gabriel Charette01b83012018-04-13 20:29:35197
Gabriel Charettee6bea7b22018-04-14 03:56:08198// static
Carlos Caballero4a050922020-07-02 11:43:38199CurrentIOThread CurrentIOThread::Get() {
Carlos Caballero14712af92019-04-17 16:13:01200 auto* sequence_manager = GetCurrentSequenceManagerImpl();
201 DCHECK(sequence_manager);
Carlos Caballerodd8bf7b042019-07-30 14:14:15202 DCHECK(sequence_manager->IsType(MessagePumpType::IO));
Carlos Caballero4a050922020-07-02 11:43:38203 return CurrentIOThread(sequence_manager);
Gabriel Charettee6bea7b22018-04-14 03:56:08204}
205
206// static
Carlos Caballero4a050922020-07-02 11:43:38207bool CurrentIOThread::IsSet() {
Carlos Caballero14712af92019-04-17 16:13:01208 auto* sequence_manager = GetCurrentSequenceManagerImpl();
Carlos Caballerodd8bf7b042019-07-30 14:14:15209 return sequence_manager && sequence_manager->IsType(MessagePumpType::IO);
Gabriel Charettee6bea7b22018-04-14 03:56:08210}
211
Carlos Caballero4a050922020-07-02 11:43:38212MessagePumpForIO* CurrentIOThread::GetMessagePumpForIO() const {
Alex Clarke605c2032018-11-14 18:46:32213 return static_cast<MessagePumpForIO*>(current_->GetMessagePump());
214}
215
Xiaohan Wangbba17e22022-01-15 17:58:14216#if BUILDFLAG(IS_WIN)
François Doray5b785902024-11-05 14:32:04217bool CurrentIOThread::RegisterIOHandler(HANDLE file,
218 MessagePumpForIO::IOHandler* handler) {
Alex Clarke605c2032018-11-14 18:46:32219 DCHECK(current_->IsBoundToCurrentThread());
220 return GetMessagePumpForIO()->RegisterIOHandler(file, handler);
Gabriel Charette01b83012018-04-13 20:29:35221}
222
Carlos Caballero4a050922020-07-02 11:43:38223bool CurrentIOThread::RegisterJobObject(HANDLE job,
224 MessagePumpForIO::IOHandler* handler) {
Alex Clarke605c2032018-11-14 18:46:32225 DCHECK(current_->IsBoundToCurrentThread());
226 return GetMessagePumpForIO()->RegisterJobObject(job, handler);
Gabriel Charette01b83012018-04-13 20:29:35227}
228
Xiaohan Wangbba17e22022-01-15 17:58:14229#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
Carlos Caballero4a050922020-07-02 11:43:38230bool CurrentIOThread::WatchFileDescriptor(
Gabriel Charette01b83012018-04-13 20:29:35231 int fd,
232 bool persistent,
233 MessagePumpForIO::Mode mode,
234 MessagePumpForIO::FdWatchController* controller,
235 MessagePumpForIO::FdWatcher* delegate) {
Alex Clarke605c2032018-11-14 18:46:32236 DCHECK(current_->IsBoundToCurrentThread());
237 return GetMessagePumpForIO()->WatchFileDescriptor(fd, persistent, mode,
238 controller, delegate);
Gabriel Charette01b83012018-04-13 20:29:35239}
Xiaohan Wangbba17e22022-01-15 17:58:14240#endif // BUILDFLAG(IS_WIN)
Gabriel Charette01b83012018-04-13 20:29:35241
Raphael Kubo da Costa50af5a9b2025-04-17 21:50:03242#if BUILDFLAG(IS_MAC) || \
243 (BUILDFLAG(IS_IOS) && !BUILDFLAG(CRONET_BUILD) && !BUILDFLAG(IS_IOS_TVOS))
Carlos Caballero4a050922020-07-02 11:43:38244bool CurrentIOThread::WatchMachReceivePort(
Robert Sesekc96c6322019-02-23 01:26:16245 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 Wangbba17e22022-01-15 17:58:14254#if BUILDFLAG(IS_FUCHSIA)
Gabriel Charette01b83012018-04-13 20:29:35255// Additional watch API for native platform resources.
Carlos Caballero4a050922020-07-02 11:43:38256bool CurrentIOThread::WatchZxHandle(
Gabriel Charette01b83012018-04-13 20:29:35257 zx_handle_t handle,
258 bool persistent,
259 zx_signals_t signals,
260 MessagePumpForIO::ZxHandleWatchController* controller,
261 MessagePumpForIO::ZxHandleWatcher* delegate) {
Alex Clarke605c2032018-11-14 18:46:32262 DCHECK(current_->IsBoundToCurrentThread());
263 return GetMessagePumpForIO()->WatchZxHandle(handle, persistent, signals,
264 controller, delegate);
Gabriel Charette01b83012018-04-13 20:29:35265}
266#endif
267
268} // namespace base