#include "base/task/thread_pool/thread_group_impl.h"
#include <optional>
#include <string_view>
#include "base/auto_reset.h"
#include "base/metrics/histogram_macros.h"
#include "base/sequence_token.h"
#include "base/strings/stringprintf.h"
#include "base/task/common/checked_lock.h"
#include "base/task/thread_pool/worker_thread.h"
#include "base/threading/scoped_blocking_call.h"
#include "base/threading/scoped_blocking_call_internal.h"
#include "base/threading/thread_checker.h"
#include "base/time/time_override.h"
#include "base/trace_event/base_tracing.h"
#include "third_party/abseil-cpp/absl/container/inlined_vector.h"
namespace base {
namespace internal {
namespace {
constexpr size_t kMaxNumberOfWorkers = …;
}
class ThreadGroupImpl::ScopedCommandsExecutor
: public ThreadGroup::BaseScopedCommandsExecutor { … };
class ThreadGroupImpl::WorkerDelegate : public WorkerThread::Delegate,
public BlockingObserver { … };
ThreadGroupImpl::ThreadGroupImpl(std::string_view histogram_label,
std::string_view thread_group_label,
ThreadType thread_type_hint,
TrackedRef<TaskTracker> task_tracker,
TrackedRef<Delegate> delegate)
: … { … }
void ThreadGroupImpl::Start(
size_t max_tasks,
size_t max_best_effort_tasks,
TimeDelta suggested_reclaim_time,
scoped_refptr<SingleThreadTaskRunner> service_thread_task_runner,
WorkerThreadObserver* worker_thread_observer,
WorkerEnvironment worker_environment,
bool synchronous_thread_start_for_testing,
std::optional<TimeDelta> may_block_threshold) { … }
ThreadGroupImpl::~ThreadGroupImpl() { … }
void ThreadGroupImpl::UpdateSortKey(TaskSource::Transaction transaction) { … }
void ThreadGroupImpl::PushTaskSourceAndWakeUpWorkers(
RegisteredTaskSourceAndTransaction transaction_with_task_source) { … }
ThreadGroupImpl::WorkerDelegate::WorkerDelegate(
TrackedRef<ThreadGroupImpl> outer,
bool is_excess)
: … { … }
ThreadGroupImpl::WorkerDelegate::WorkerOnly::WorkerOnly() = default;
ThreadGroupImpl::WorkerDelegate::WorkerOnly::~WorkerOnly() = default;
TimeDelta ThreadGroupImpl::WorkerDelegate::GetSleepTimeout() { … }
void ThreadGroupImpl::WorkerDelegate::OnMainEntry(WorkerThread* worker) { … }
void ThreadGroupImpl::WorkerDelegate::OnMainExit(WorkerThread* worker_base) { … }
bool ThreadGroupImpl::WorkerDelegate::CanGetWorkLockRequired(
BaseScopedCommandsExecutor* executor,
WorkerThread* worker_base) { … }
RegisteredTaskSource ThreadGroupImpl::WorkerDelegate::GetWork(
WorkerThread* worker) { … }
RegisteredTaskSource ThreadGroupImpl::WorkerDelegate::GetWorkLockRequired(
BaseScopedCommandsExecutor* executor,
WorkerThread* worker) { … }
RegisteredTaskSource ThreadGroupImpl::WorkerDelegate::SwapProcessedTask(
RegisteredTaskSource task_source,
WorkerThread* worker) { … }
bool ThreadGroupImpl::WorkerDelegate::CanCleanupLockRequired(
const WorkerThread* worker) { … }
void ThreadGroupImpl::WorkerDelegate::CleanupLockRequired(
BaseScopedCommandsExecutor* executor,
WorkerThread* worker_base) { … }
void ThreadGroupImpl::WorkerDelegate::OnWorkerBecomesIdleLockRequired(
BaseScopedCommandsExecutor* executor,
WorkerThread* worker_base) { … }
void ThreadGroupImpl::WorkerDelegate::RecordUnnecessaryWakeup() { … }
void ThreadGroupImpl::WorkerDelegate::BlockingStarted(
BlockingType blocking_type) { … }
void ThreadGroupImpl::WorkerDelegate::BlockingTypeUpgraded() { … }
void ThreadGroupImpl::WorkerDelegate::BlockingEnded() { … }
void ThreadGroupImpl::WorkerDelegate::OnShutdownStartedLockRequired(
BaseScopedCommandsExecutor* executor) { … }
void ThreadGroupImpl::WorkerDelegate::MaybeIncrementMaxTasksLockRequired()
EXCLUSIVE_LOCKS_REQUIRED(outer_->lock_) { … }
void ThreadGroupImpl::WorkerDelegate::IncrementMaxTasksLockRequired()
EXCLUSIVE_LOCKS_REQUIRED(outer_->lock_) { … }
void ThreadGroupImpl::JoinForTesting() { … }
size_t ThreadGroupImpl::NumberOfIdleWorkersLockRequiredForTesting() const { … }
void ThreadGroupImpl::MaintainAtLeastOneIdleWorkerLockRequired(
ScopedCommandsExecutor* executor) { … }
scoped_refptr<WorkerThread>
ThreadGroupImpl::CreateAndRegisterWorkerLockRequired(
ScopedCommandsExecutor* executor) { … }
size_t ThreadGroupImpl::GetNumAwakeWorkersLockRequired() const { … }
void ThreadGroupImpl::DidUpdateCanRunPolicy() { … }
void ThreadGroupImpl::OnShutdownStarted() { … }
void ThreadGroupImpl::EnsureEnoughWorkersLockRequired(
BaseScopedCommandsExecutor* base_executor) { … }
bool ThreadGroupImpl::IsOnIdleSetLockRequired(WorkerThread* worker) const { … }
void ThreadGroupImpl::ScheduleAdjustMaxTasks() { … }
void ThreadGroupImpl::AdjustMaxTasks() { … }
}
}