blob: 0a5140000b9b028b6428d7faad3e7b641b56ea82 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_THREADING_PLATFORM_THREAD_INTERNAL_H_
#define BASE_THREADING_PLATFORM_THREAD_INTERNAL_H_
#include <array>
#include <cstdint>
#include <optional>
#include "base/base_export.h"
#include "base/message_loop/message_pump_type.h"
#include "base/task/thread_type.h"
namespace base::internal {
// Manages the thread's ThreadType by allowing it to be raised via
// leases. The effective thread type is the maximum of:
// 1. The default thread type (set via SetDefault()).
// 2. The highest active raise lease (managed via Acquire/DropRaiseLease()).
//
// This allows a thread to have a baseline priority while temporarily boosting
// it for critical sections or based on workload requirements, without losing
// track of the original priority.
class BASE_EXPORT ThreadTypeManager {
public:
class RaiseLeases {
public:
void Acquire(ThreadType thread_type);
void Drop(ThreadType thread_type);
std::optional<ThreadType> GetHighestLease() const;
private:
// Contains the number of active leases for each thread type. The positions
// correspond to the enum values of ThreadType.
std::array<uint32_t, static_cast<int>(ThreadType::kMaxValue) + 1> leases =
{};
// A bitmask of the thread types that have active leases. This is used to
// find the highest active lease thread type via Log2Floor.
uint32_t bitmask = 0;
};
ThreadTypeManager() = default;
virtual ~ThreadTypeManager() = default;
ThreadTypeManager(const ThreadTypeManager&) = delete;
ThreadTypeManager& operator=(const ThreadTypeManager&) = delete;
void SetDefault(ThreadType type);
ThreadType GetCurrent() const;
void MaybeUpdate();
void AcquireRaiseLease(ThreadType type);
void DropRaiseLease(ThreadType type);
bool HasLeases() const;
private:
virtual void SetCurrentThreadTypeImpl(ThreadType thread_type,
MessagePumpType pump_type_hint);
// `default_thread_type_` can be nullopt to be able to express the state
// where neither SetDefault has been used, nor any leases have been created.
// In this state, the thread's type isn't managed by ThreadTypeManager but is
// what the OS has assigned for the thread (which may not be expressible as a
// Chromium ThreadType). From this state, the first lease or SetDefault call
// will apply the thread's initial type.
std::optional<ThreadType> default_thread_type_;
// The thread type last applied to the thread. This is nullopt if no thread
// type has ever been applied by SetDefault or leases.
std::optional<ThreadType> effective_thread_type_;
RaiseLeases raise_leases_;
};
} // namespace base::internal
#endif // BASE_THREADING_PLATFORM_THREAD_INTERNAL_H_