| // Copyright 2018 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/threading/platform_thread.h" |
| |
| #include "base/task/current_thread.h" |
| #include "base/threading/thread_id_name_manager.h" |
| #include "base/trace_event/base_tracing.h" |
| |
| #if BUILDFLAG(IS_FUCHSIA) |
| #include "base/fuchsia/scheduler.h" |
| #endif |
| |
| namespace base { |
| |
| namespace { |
| |
| constinit thread_local ThreadType current_thread_type = ThreadType::kDefault; |
| |
| } // namespace |
| |
| void PlatformThreadId::WriteIntoTrace(perfetto::TracedValue&& context) const { |
| perfetto::WriteIntoTracedValue(std::move(context), value_); |
| } |
| |
| // static |
| void PlatformThreadBase::SetCurrentThreadType(ThreadType thread_type) { |
| MessagePumpType message_pump_type = MessagePumpType::DEFAULT; |
| if (CurrentIOThread::IsSet()) { |
| message_pump_type = MessagePumpType::IO; |
| } |
| #if !BUILDFLAG(IS_NACL) |
| else if (CurrentUIThread::IsSet()) { |
| message_pump_type = MessagePumpType::UI; |
| } |
| #endif |
| internal::SetCurrentThreadType(thread_type, message_pump_type); |
| } |
| |
| // static |
| ThreadType PlatformThreadBase::GetCurrentThreadType() { |
| return current_thread_type; |
| } |
| |
| // static |
| std::optional<TimeDelta> PlatformThreadBase::GetThreadLeewayOverride() { |
| #if BUILDFLAG(IS_FUCHSIA) |
| // On Fuchsia, all audio threads run with the CPU scheduling profile that uses |
| // an interval of |kAudioSchedulingPeriod|. Using the default leeway may lead |
| // to some tasks posted to audio threads to be executed too late (see |
| // http://crbug.com/1368858). |
| if (GetCurrentThreadType() == ThreadType::kRealtimeAudio) { |
| return kAudioSchedulingPeriod; |
| } |
| #endif |
| return std::nullopt; |
| } |
| |
| // static |
| void PlatformThreadBase::SetNameCommon(const std::string& name) { |
| ThreadIdNameManager::GetInstance()->SetName(name); |
| } |
| |
| namespace internal { |
| |
| void SetCurrentThreadType(ThreadType thread_type, |
| MessagePumpType pump_type_hint) { |
| CHECK_LE(thread_type, ThreadType::kMaxValue); |
| SetCurrentThreadTypeImpl(thread_type, pump_type_hint); |
| current_thread_type = thread_type; |
| } |
| |
| } // namespace internal |
| |
| } // namespace base |