#include "base/threading/platform_thread.h"
#include "base/task/current_thread.h"
#include "third_party/abseil-cpp/absl/base/attributes.h"
#if BUILDFLAG(IS_FUCHSIA)
#include "base/fuchsia/scheduler.h"
#endif
namespace base {
namespace {
ABSL_CONST_INIT thread_local ThreadType current_thread_type =
ThreadType::kDefault;
}
void PlatformThread::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);
}
ThreadType PlatformThread::GetCurrentThreadType() {
return current_thread_type;
}
absl::optional<TimeDelta> PlatformThread::GetThreadLeewayOverride() {
#if BUILDFLAG(IS_FUCHSIA)
if (GetCurrentThreadType() == ThreadType::kRealtimeAudio)
return kAudioSchedulingPeriod;
#endif
return absl::nullopt;
}
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;
}
}
}