#include "components/app_launch_prefetch/app_launch_prefetch.h"
#include <tuple>
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/notreached.h"
#include "base/win/windows_version.h"
namespace app_launch_prefetch {
namespace {
BASE_FEATURE(kExpandedPrefetchRange, base::FEATURE_ENABLED_BY_DEFAULT);
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument1 = {L"/prefetch:1", 1};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument2 = {L"/prefetch:2", 2};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument3 = {L"/prefetch:3", 3};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument4 = {L"/prefetch:4", 4};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument5 = {L"/prefetch:5", 5};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument7 = {L"/prefetch:7", 7};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument8 = {L"/prefetch:8", 8};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument9 = {L"/prefetch:9", 9};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument10 = {L"/prefetch:10", 10};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument11 = {L"/prefetch:11", 11};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument12 = {L"/prefetch:12", 12};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument13 = {L"/prefetch:13", 13};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument14 = {L"/prefetch:14", 14};
constexpr std::tuple<base::CommandLine::StringViewType, int>
kPrefetchArgument16 = {L"/prefetch:16", 16};
const std::tuple<base::CommandLine::StringViewType, int>& GetPrefetchInfo(
SubprocessType type) {
using enum SubprocessType;
if (base::win::GetVersion() >= base::win::Version::WIN11 &&
base::FeatureList::GetInstance() &&
base::FeatureList::IsEnabled(kExpandedPrefetchRange)) {
switch (type) {
case kBrowser:
NOTREACHED();
case kRenderer:
return kPrefetchArgument1;
case kGPU:
return kPrefetchArgument2;
case kPpapi:
return kPrefetchArgument3;
case kCrashpad:
return kPrefetchArgument4;
case kBrowserBackground:
return kPrefetchArgument5;
case kCrashpadFallback:
return kPrefetchArgument7;
case kExtension:
return kPrefetchArgument9;
case kGPUInfo:
return kPrefetchArgument10;
case kUtilityNetworkService:
return kPrefetchArgument11;
case kUtilityAudio:
return kPrefetchArgument12;
case kUtilityStorage:
return kPrefetchArgument13;
case kUtilityOther:
return kPrefetchArgument14;
case kCatchAll:
return kPrefetchArgument16;
}
} else {
switch (type) {
case kBrowser:
NOTREACHED();
case kRenderer:
return kPrefetchArgument1;
case kGPU:
return kPrefetchArgument2;
case kExtension:
return kPrefetchArgument2;
case kPpapi:
return kPrefetchArgument3;
case kUtilityNetworkService:
return kPrefetchArgument3;
case kCrashpad:
return kPrefetchArgument4;
case kBrowserBackground:
return kPrefetchArgument5;
case kCrashpadFallback:
return kPrefetchArgument7;
case kGPUInfo:
return kPrefetchArgument8;
case kUtilityAudio:
return kPrefetchArgument8;
case kUtilityStorage:
return kPrefetchArgument8;
case kUtilityOther:
return kPrefetchArgument8;
case kCatchAll:
return kPrefetchArgument8;
}
}
}
}
base::CommandLine::StringViewType GetPrefetchSwitch(SubprocessType type) {
return std::get<0>(GetPrefetchInfo(type));
}
uint32_t GetPrefetchBucket(SubprocessType type) {
return std::get<1>(GetPrefetchInfo(type));
}
}