// 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/task/task_features.h" #include #include "base/base_export.h" #include "base/feature_list.h" #include "base/threading/platform_thread.h" namespace base { // Note to implementers: thread pool code using task features must absolutely // not invoke FeatureList::IsEnabled outside of the main thread. Doing so // causes data races between worker threads and ~FeatureList when tests end // (crbug.com/1344573). A reliable moment to query and cache the feature state // is on ThreadPoolImpl::Start (and thus also on the first WorkerThread::Start, // not the later ones) as this is invoked from the main thread after // initializing the FeatureList. If caching the feature state in a static, you // must be aware that all tests sharing a process will have the same state, // regardless of future ScopedFeatureList instances. BASE_FEATURE(kUseUtilityThreadGroup, "UseUtilityThreadGroup", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kNoWorkerThreadReclaim, "NoWorkerThreadReclaim", base::FEATURE_ENABLED_BY_DEFAULT); // static BASE_FEATURE(kNoWakeUpsForCanceledTasks, "NoWakeUpsForCanceledTasks", FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kRemoveCanceledTasksInTaskQueue, "RemoveCanceledTasksInTaskQueue2", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kDelayFirstWorkerWake, "DelayFirstWorkerWake", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAddTaskLeewayFeature, "AddTaskLeeway", base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam kTaskLeewayParam{&kAddTaskLeewayFeature, "leeway", kDefaultLeeway}; BASE_FEATURE(kAlignWakeUps, "AlignWakeUps", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kExplicitHighResolutionTimerWin, "ExplicitHighResolutionTimerWin", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kRunTasksByBatches, "RunTasksByBatches", base::FEATURE_DISABLED_BY_DEFAULT); // Leeway value applied to delayed tasks. An atomic is used here because the // value is queried from multiple threads. std::atomic g_task_leeway{kDefaultLeeway}; BASE_EXPORT void InitializeTaskLeeway() { g_task_leeway.store(kTaskLeewayParam.Get(), std::memory_order_relaxed); } BASE_EXPORT TimeDelta GetTaskLeewayForCurrentThread() { // For some threads, there might be a override of the leeway, so check it // first. auto leeway_override = PlatformThread::GetThreadLeewayOverride(); if (leeway_override.has_value()) return leeway_override.value(); return g_task_leeway.load(std::memory_order_relaxed); } BASE_EXPORT TimeDelta GetDefaultTaskLeeway() { return g_task_leeway.load(std::memory_order_relaxed); } BASE_FEATURE(kMaxDelayedStarvationTasks, "MaxDelayedStarvationTasks", base::FEATURE_ENABLED_BY_DEFAULT); const base::FeatureParam kMaxDelayedStarvationTasksParam{ &kMaxDelayedStarvationTasks, "count", 3}; } // namespace base