Home | History | Annotate | Download | only in metrics
      1 // Copyright 2016 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_METRICS_FIELD_TRIAL_PARAM_ASSOCIATOR_H_
      6 #define BASE_METRICS_FIELD_TRIAL_PARAM_ASSOCIATOR_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <utility>
     11 
     12 #include "base/base_export.h"
     13 #include "base/memory/singleton.h"
     14 #include "base/metrics/field_trial.h"
     15 #include "base/synchronization/lock.h"
     16 
     17 namespace base {
     18 
     19 // Keeps track of the parameters of all field trials and ensures access to them
     20 // is thread-safe.
     21 class BASE_EXPORT FieldTrialParamAssociator {
     22  public:
     23   FieldTrialParamAssociator();
     24   ~FieldTrialParamAssociator();
     25 
     26   // Key-value mapping type for field trial parameters.
     27   typedef std::map<std::string, std::string> FieldTrialParams;
     28 
     29   // Retrieve the singleton.
     30   static FieldTrialParamAssociator* GetInstance();
     31 
     32   // Sets parameters for the given field trial name and group.
     33   bool AssociateFieldTrialParams(const std::string& trial_name,
     34                                  const std::string& group_name,
     35                                  const FieldTrialParams& params);
     36 
     37   // Gets the parameters for a field trial and its chosen group. If not found in
     38   // field_trial_params_, then tries to looks it up in shared memory.
     39   bool GetFieldTrialParams(const std::string& trial_name,
     40                            FieldTrialParams* params);
     41 
     42   // Gets the parameters for a field trial and its chosen group. Does not
     43   // fallback to looking it up in shared memory. This should only be used if you
     44   // know for sure the params are in the mapping, like if you're in the browser
     45   // process, and even then you should probably just use GetFieldTrialParams().
     46   bool GetFieldTrialParamsWithoutFallback(const std::string& trial_name,
     47                                           const std::string& group_name,
     48                                           FieldTrialParams* params);
     49 
     50   // Clears the internal field_trial_params_ mapping, plus removes all params in
     51   // shared memory.
     52   void ClearAllParamsForTesting();
     53 
     54   // Clears the internal field_trial_params_ mapping.
     55   void ClearAllCachedParamsForTesting();
     56 
     57  private:
     58   friend struct DefaultSingletonTraits<FieldTrialParamAssociator>;
     59 
     60   // (field_trial_name, field_trial_group)
     61   typedef std::pair<std::string, std::string> FieldTrialKey;
     62 
     63   Lock lock_;
     64   std::map<FieldTrialKey, FieldTrialParams> field_trial_params_;
     65 
     66   DISALLOW_COPY_AND_ASSIGN(FieldTrialParamAssociator);
     67 };
     68 
     69 }  // namespace base
     70 
     71 #endif  // BASE_METRICS_FIELD_TRIAL_PARAM_ASSOCIATOR_H_
     72