xref: /aosp_15_r20/external/cronet/base/allocator/miracle_parameter.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/allocator/miracle_parameter.h"
6 
7 #include "base/command_line.h"
8 #include "base/strings/strcat.h"
9 #include "base/system/sys_info.h"
10 
11 namespace base {
12 
13 namespace miracle_parameter {
14 
15 namespace {
16 
GetFieldTrialParamByFeatureAsString(const base::Feature & feature,const std::string & param_name,const std::string & default_value)17 std::string GetFieldTrialParamByFeatureAsString(
18     const base::Feature& feature,
19     const std::string& param_name,
20     const std::string& default_value) {
21   const std::string value =
22       base::GetFieldTrialParamValueByFeature(feature, param_name);
23   return value.empty() ? default_value : value;
24 }
25 
26 }  // namespace
27 
GetParamNameWithSuffix(const std::string & param_name)28 std::string GetParamNameWithSuffix(const std::string& param_name) {
29   // `base::SysInfo::AmountOfPhysicalMemoryMB()` refers to CommandLine
30   // internally. If the CommandLine is not initialized, we return early to avoid
31   // a crash.
32   if (!base::CommandLine::InitializedForCurrentProcess()) {
33     return param_name;
34   }
35   int physical_memory_mb = base::SysInfo::AmountOfPhysicalMemoryMB();
36   const char* suffix =
37       physical_memory_mb < kMiracleParameterMemory512MB  ? "ForLessThan512MB"
38       : physical_memory_mb < kMiracleParameterMemory1GB  ? "For512MBTo1GB"
39       : physical_memory_mb < kMiracleParameterMemory2GB  ? "For1GBTo2GB"
40       : physical_memory_mb < kMiracleParameterMemory4GB  ? "For2GBTo4GB"
41       : physical_memory_mb < kMiracleParameterMemory8GB  ? "For4GBTo8GB"
42       : physical_memory_mb < kMiracleParameterMemory16GB ? "For8GBTo16GB"
43                                                          : "For16GBAndAbove";
44   return base::StrCat({param_name, suffix});
45 }
46 
GetMiracleParameterAsString(const base::Feature & feature,const std::string & param_name,const std::string & default_value)47 std::string GetMiracleParameterAsString(const base::Feature& feature,
48                                         const std::string& param_name,
49                                         const std::string& default_value) {
50   return GetFieldTrialParamByFeatureAsString(
51       feature, GetParamNameWithSuffix(param_name),
52       GetFieldTrialParamByFeatureAsString(feature, param_name, default_value));
53 }
54 
GetMiracleParameterAsDouble(const base::Feature & feature,const std::string & param_name,double default_value)55 double GetMiracleParameterAsDouble(const base::Feature& feature,
56                                    const std::string& param_name,
57                                    double default_value) {
58   return base::GetFieldTrialParamByFeatureAsDouble(
59       feature, GetParamNameWithSuffix(param_name),
60       base::GetFieldTrialParamByFeatureAsDouble(feature, param_name,
61                                                 default_value));
62 }
63 
GetMiracleParameterAsInt(const base::Feature & feature,const std::string & param_name,int default_value)64 int GetMiracleParameterAsInt(const base::Feature& feature,
65                              const std::string& param_name,
66                              int default_value) {
67   return base::GetFieldTrialParamByFeatureAsInt(
68       feature, GetParamNameWithSuffix(param_name),
69       base::GetFieldTrialParamByFeatureAsInt(feature, param_name,
70                                              default_value));
71 }
72 
GetMiracleParameterAsBool(const base::Feature & feature,const std::string & param_name,bool default_value)73 bool GetMiracleParameterAsBool(const base::Feature& feature,
74                                const std::string& param_name,
75                                bool default_value) {
76   return base::GetFieldTrialParamByFeatureAsBool(
77       feature, GetParamNameWithSuffix(param_name),
78       base::GetFieldTrialParamByFeatureAsBool(feature, param_name,
79                                               default_value));
80 }
81 
GetMiracleParameterAsTimeDelta(const base::Feature & feature,const std::string & param_name,base::TimeDelta default_value)82 base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature,
83                                                const std::string& param_name,
84                                                base::TimeDelta default_value) {
85   return base::GetFieldTrialParamByFeatureAsTimeDelta(
86       feature, GetParamNameWithSuffix(param_name),
87       base::GetFieldTrialParamByFeatureAsTimeDelta(feature, param_name,
88                                                    default_value));
89 }
90 
91 }  // namespace miracle_parameter
92 
93 }  // namespace base
94