xref: /aosp_15_r20/external/cronet/base/metrics/field_trial_param_associator.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2016 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/metrics/field_trial_param_associator.h"
6 
7 #include "base/containers/contains.h"
8 #include "base/logging.h"
9 #include "base/metrics/field_trial.h"
10 
11 namespace base {
12 
13 FieldTrialParamAssociator::FieldTrialParamAssociator() = default;
14 FieldTrialParamAssociator::~FieldTrialParamAssociator() = default;
15 
16 // static
GetInstance()17 FieldTrialParamAssociator* FieldTrialParamAssociator::GetInstance() {
18   return Singleton<FieldTrialParamAssociator,
19                    LeakySingletonTraits<FieldTrialParamAssociator>>::get();
20 }
21 
AssociateFieldTrialParams(const std::string & trial_name,const std::string & group_name,const FieldTrialParams & params)22 bool FieldTrialParamAssociator::AssociateFieldTrialParams(
23     const std::string& trial_name,
24     const std::string& group_name,
25     const FieldTrialParams& params) {
26   if (FieldTrialList::IsTrialActive(trial_name)) {
27     DLOG(ERROR) << "Field trial " << trial_name << " is already active.";
28     return false;
29   }
30 
31   AutoLock scoped_lock(lock_);
32   const FieldTrialKey key(trial_name, group_name);
33   if (Contains(field_trial_params_, key)) {
34     DLOG(ERROR) << "You can't override the existing params for field trial: "
35                 << trial_name << "." << group_name;
36     return false;
37   }
38 
39   field_trial_params_[key] = params;
40   return true;
41 }
42 
GetFieldTrialParams(FieldTrial * field_trial,FieldTrialParams * params)43 bool FieldTrialParamAssociator::GetFieldTrialParams(FieldTrial* field_trial,
44                                                     FieldTrialParams* params) {
45   if (!field_trial)
46     return false;
47   // First try the local map, falling back to getting it from shared memory.
48   if (GetFieldTrialParamsWithoutFallback(field_trial->trial_name(),
49                                          field_trial->group_name(), params)) {
50     return true;
51   }
52 
53   // TODO(lawrencewu): add the params to field_trial_params_ for next time.
54   return FieldTrialList::GetParamsFromSharedMemory(field_trial, params);
55 }
56 
GetFieldTrialParamsWithoutFallback(const std::string & trial_name,const std::string & group_name,FieldTrialParams * params)57 bool FieldTrialParamAssociator::GetFieldTrialParamsWithoutFallback(
58     const std::string& trial_name,
59     const std::string& group_name,
60     FieldTrialParams* params) {
61   AutoLock scoped_lock(lock_);
62 
63   const FieldTrialRefKey key(trial_name, group_name);
64   auto it = field_trial_params_.find(key);
65   if (it == field_trial_params_.end())
66     return false;
67 
68   *params = it->second;
69   return true;
70 }
71 
ClearAllParamsForTesting()72 void FieldTrialParamAssociator::ClearAllParamsForTesting() {
73   {
74     AutoLock scoped_lock(lock_);
75     field_trial_params_.clear();
76   }
77   FieldTrialList::ClearParamsFromSharedMemoryForTesting();
78 }
79 
ClearParamsForTesting(const std::string & trial_name,const std::string & group_name)80 void FieldTrialParamAssociator::ClearParamsForTesting(
81     const std::string& trial_name,
82     const std::string& group_name) {
83   AutoLock scoped_lock(lock_);
84   const FieldTrialRefKey key(trial_name, group_name);
85   field_trial_params_.erase(key);
86 }
87 
ClearAllCachedParamsForTesting()88 void FieldTrialParamAssociator::ClearAllCachedParamsForTesting() {
89   AutoLock scoped_lock(lock_);
90   field_trial_params_.clear();
91 }
92 
ClearAllCachedParams(PassKey<AppShimController>)93 void FieldTrialParamAssociator::ClearAllCachedParams(
94     PassKey<AppShimController>) {
95   AutoLock scoped_lock(lock_);
96   field_trial_params_.clear();
97 }
98 
99 }  // namespace base
100