xref: /aosp_15_r20/external/cronet/base/allocator/miracle_parameter.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_ALLOCATOR_MIRACLE_PARAMETER_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_ALLOCATOR_MIRACLE_PARAMETER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/metrics/field_trial_params.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker // This is a mirror copy of the //components/miracle_parameter/ to resolve the
14*6777b538SAndroid Build Coastguard Worker // dependency cycle of (base->miracle_parameter->base).
15*6777b538SAndroid Build Coastguard Worker // Eventually the miracle_parameter component will have a public interface in
16*6777b538SAndroid Build Coastguard Worker // //base/ and this could be removed.
17*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1475915): remove miracle_parameter from
18*6777b538SAndroid Build Coastguard Worker // //base/allocator/.
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker namespace base {
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker namespace miracle_parameter {
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker namespace {
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker template <typename Enum>
GetFieldTrialParamByFeatureAsEnum(const base::Feature & feature,const std::string & param_name,const Enum default_value,const base::span<const typename base::FeatureParam<Enum>::Option> & options)27*6777b538SAndroid Build Coastguard Worker Enum GetFieldTrialParamByFeatureAsEnum(
28*6777b538SAndroid Build Coastguard Worker     const base::Feature& feature,
29*6777b538SAndroid Build Coastguard Worker     const std::string& param_name,
30*6777b538SAndroid Build Coastguard Worker     const Enum default_value,
31*6777b538SAndroid Build Coastguard Worker     const base::span<const typename base::FeatureParam<Enum>::Option>&
32*6777b538SAndroid Build Coastguard Worker         options) {
33*6777b538SAndroid Build Coastguard Worker   std::string string_value =
34*6777b538SAndroid Build Coastguard Worker       base::GetFieldTrialParamValueByFeature(feature, param_name);
35*6777b538SAndroid Build Coastguard Worker   if (string_value.empty()) {
36*6777b538SAndroid Build Coastguard Worker     return default_value;
37*6777b538SAndroid Build Coastguard Worker   }
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   for (const auto& option : options) {
40*6777b538SAndroid Build Coastguard Worker     if (string_value == option.name) {
41*6777b538SAndroid Build Coastguard Worker       return option.value;
42*6777b538SAndroid Build Coastguard Worker     }
43*6777b538SAndroid Build Coastguard Worker   }
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   base::LogInvalidEnumValue(feature, param_name, string_value,
46*6777b538SAndroid Build Coastguard Worker                             static_cast<int>(default_value));
47*6777b538SAndroid Build Coastguard Worker   return default_value;
48*6777b538SAndroid Build Coastguard Worker }
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker }  // namespace
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory512MB = 512;
53*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory1GB = 1024;
54*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory2GB = 2 * 1024;
55*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory4GB = 4 * 1024;
56*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory8GB = 8 * 1024;
57*6777b538SAndroid Build Coastguard Worker constexpr int kMiracleParameterMemory16GB = 16 * 1024;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker // GetParamNameWithSuffix put a parameter name suffix based on
60*6777b538SAndroid Build Coastguard Worker // the amount of physical memory.
61*6777b538SAndroid Build Coastguard Worker //
62*6777b538SAndroid Build Coastguard Worker // - "ForLessThan512MB" for less than 512MB memory devices.
63*6777b538SAndroid Build Coastguard Worker // - "For512MBTo1GB" for 512MB to 1GB memory devices.
64*6777b538SAndroid Build Coastguard Worker // - "For1GBTo2GB" for 1GB to 2GB memory devices.
65*6777b538SAndroid Build Coastguard Worker // - "For2GBTo4GB" for 2GB to 4GB memory devices.
66*6777b538SAndroid Build Coastguard Worker // - "For4GBTo8GB" for 4GB to 8GB memory devices.
67*6777b538SAndroid Build Coastguard Worker // - "For8GBTo16GB" for 8GB to 16GB memory devices.
68*6777b538SAndroid Build Coastguard Worker // - "For16GBAndAbove" for 16GB memory and above devices.
69*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
70*6777b538SAndroid Build Coastguard Worker std::string GetParamNameWithSuffix(const std::string& param_name);
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<std::string> except the return
73*6777b538SAndroid Build Coastguard Worker // value is determined by the amount of physical memory.
74*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
75*6777b538SAndroid Build Coastguard Worker std::string GetMiracleParameterAsString(const base::Feature& feature,
76*6777b538SAndroid Build Coastguard Worker                                         const std::string& param_name,
77*6777b538SAndroid Build Coastguard Worker                                         const std::string& default_value);
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<double> except the return value
80*6777b538SAndroid Build Coastguard Worker // is determined by the amount of physical memory.
81*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
82*6777b538SAndroid Build Coastguard Worker double GetMiracleParameterAsDouble(const base::Feature& feature,
83*6777b538SAndroid Build Coastguard Worker                                    const std::string& param_name,
84*6777b538SAndroid Build Coastguard Worker                                    double default_value);
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<int> except the return value is
87*6777b538SAndroid Build Coastguard Worker // determined by the amount of physical memory.
88*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
89*6777b538SAndroid Build Coastguard Worker int GetMiracleParameterAsInt(const base::Feature& feature,
90*6777b538SAndroid Build Coastguard Worker                              const std::string& param_name,
91*6777b538SAndroid Build Coastguard Worker                              int default_value);
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<bool> except the return value
94*6777b538SAndroid Build Coastguard Worker // is determined by the amount of physical memory.
95*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
96*6777b538SAndroid Build Coastguard Worker bool GetMiracleParameterAsBool(const base::Feature& feature,
97*6777b538SAndroid Build Coastguard Worker                                const std::string& param_name,
98*6777b538SAndroid Build Coastguard Worker                                bool default_value);
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<base::TimeDelta> except the
101*6777b538SAndroid Build Coastguard Worker // return value is determined by the amount of physical memory.
102*6777b538SAndroid Build Coastguard Worker BASE_EXPORT
103*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetMiracleParameterAsTimeDelta(const base::Feature& feature,
104*6777b538SAndroid Build Coastguard Worker                                                const std::string& param_name,
105*6777b538SAndroid Build Coastguard Worker                                                base::TimeDelta default_value);
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker // Provides a similar behavior with FeatureParam<Enum> except the return value
108*6777b538SAndroid Build Coastguard Worker // is determined by the amount of physical memory.
109*6777b538SAndroid Build Coastguard Worker template <typename Enum>
GetMiracleParameterAsEnum(const base::Feature & feature,const std::string & param_name,const Enum default_value,const base::span<const typename base::FeatureParam<Enum>::Option> options)110*6777b538SAndroid Build Coastguard Worker Enum GetMiracleParameterAsEnum(
111*6777b538SAndroid Build Coastguard Worker     const base::Feature& feature,
112*6777b538SAndroid Build Coastguard Worker     const std::string& param_name,
113*6777b538SAndroid Build Coastguard Worker     const Enum default_value,
114*6777b538SAndroid Build Coastguard Worker     const base::span<const typename base::FeatureParam<Enum>::Option> options) {
115*6777b538SAndroid Build Coastguard Worker   return GetFieldTrialParamByFeatureAsEnum(
116*6777b538SAndroid Build Coastguard Worker       feature, GetParamNameWithSuffix(param_name),
117*6777b538SAndroid Build Coastguard Worker       GetFieldTrialParamByFeatureAsEnum(feature, param_name, default_value,
118*6777b538SAndroid Build Coastguard Worker                                         options),
119*6777b538SAndroid Build Coastguard Worker       options);
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_STRING(function_name, feature, param_name,    \
123*6777b538SAndroid Build Coastguard Worker                                      default_value)                         \
124*6777b538SAndroid Build Coastguard Worker   std::string function_name() {                                             \
125*6777b538SAndroid Build Coastguard Worker     static const std::string value =                                        \
126*6777b538SAndroid Build Coastguard Worker         miracle_parameter::GetMiracleParameterAsString(feature, param_name, \
127*6777b538SAndroid Build Coastguard Worker                                                        default_value);      \
128*6777b538SAndroid Build Coastguard Worker     return value;                                                           \
129*6777b538SAndroid Build Coastguard Worker   }
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_DOUBLE(function_name, feature, param_name,    \
132*6777b538SAndroid Build Coastguard Worker                                      default_value)                         \
133*6777b538SAndroid Build Coastguard Worker   double function_name() {                                                  \
134*6777b538SAndroid Build Coastguard Worker     static const double value =                                             \
135*6777b538SAndroid Build Coastguard Worker         miracle_parameter::GetMiracleParameterAsDouble(feature, param_name, \
136*6777b538SAndroid Build Coastguard Worker                                                        default_value);      \
137*6777b538SAndroid Build Coastguard Worker     return value;                                                           \
138*6777b538SAndroid Build Coastguard Worker   }
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_INT(function_name, feature, param_name,     \
141*6777b538SAndroid Build Coastguard Worker                                   default_value)                          \
142*6777b538SAndroid Build Coastguard Worker   int function_name() {                                                   \
143*6777b538SAndroid Build Coastguard Worker     static const int value = miracle_parameter::GetMiracleParameterAsInt( \
144*6777b538SAndroid Build Coastguard Worker         feature, param_name, default_value);                              \
145*6777b538SAndroid Build Coastguard Worker     return value;                                                         \
146*6777b538SAndroid Build Coastguard Worker   }
147*6777b538SAndroid Build Coastguard Worker 
148*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_BOOL(function_name, feature, param_name,      \
149*6777b538SAndroid Build Coastguard Worker                                    default_value)                           \
150*6777b538SAndroid Build Coastguard Worker   bool function_name() {                                                    \
151*6777b538SAndroid Build Coastguard Worker     static const bool value = miracle_parameter::GetMiracleParameterAsBool( \
152*6777b538SAndroid Build Coastguard Worker         feature, param_name, default_value);                                \
153*6777b538SAndroid Build Coastguard Worker     return value;                                                           \
154*6777b538SAndroid Build Coastguard Worker   }
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_TIME_DELTA(function_name, feature, param_name,   \
157*6777b538SAndroid Build Coastguard Worker                                          default_value)                        \
158*6777b538SAndroid Build Coastguard Worker   base::TimeDelta function_name() {                                            \
159*6777b538SAndroid Build Coastguard Worker     static const base::TimeDelta value =                                       \
160*6777b538SAndroid Build Coastguard Worker         miracle_parameter::GetMiracleParameterAsTimeDelta(feature, param_name, \
161*6777b538SAndroid Build Coastguard Worker                                                           default_value);      \
162*6777b538SAndroid Build Coastguard Worker     return value;                                                              \
163*6777b538SAndroid Build Coastguard Worker   }
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker #define MIRACLE_PARAMETER_FOR_ENUM(function_name, feature, param_name,      \
166*6777b538SAndroid Build Coastguard Worker                                    default_value, type, options)            \
167*6777b538SAndroid Build Coastguard Worker   type function_name() {                                                    \
168*6777b538SAndroid Build Coastguard Worker     static const type value = miracle_parameter::GetMiracleParameterAsEnum( \
169*6777b538SAndroid Build Coastguard Worker         feature, param_name, default_value, base::make_span(options));      \
170*6777b538SAndroid Build Coastguard Worker     return value;                                                           \
171*6777b538SAndroid Build Coastguard Worker   }
172*6777b538SAndroid Build Coastguard Worker 
173*6777b538SAndroid Build Coastguard Worker }  // namespace miracle_parameter
174*6777b538SAndroid Build Coastguard Worker 
175*6777b538SAndroid Build Coastguard Worker }  // namespace base
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker #endif  // BASE_ALLOCATOR_MIRACLE_PARAMETER_H_
178