| // Copyright 2016 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/metrics/field_trial_param_associator.h" | 
 |  | 
 | #include "base/metrics/field_trial.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | FieldTrialParamAssociator::FieldTrialParamAssociator() = default; | 
 | FieldTrialParamAssociator::~FieldTrialParamAssociator() = default; | 
 |  | 
 | // static | 
 | FieldTrialParamAssociator* FieldTrialParamAssociator::GetInstance() { | 
 |   return Singleton<FieldTrialParamAssociator, | 
 |                    LeakySingletonTraits<FieldTrialParamAssociator>>::get(); | 
 | } | 
 |  | 
 | bool FieldTrialParamAssociator::AssociateFieldTrialParams( | 
 |     const std::string& trial_name, | 
 |     const std::string& group_name, | 
 |     const FieldTrialParams& params) { | 
 |   if (FieldTrialList::IsTrialActive(trial_name)) | 
 |     return false; | 
 |  | 
 |   AutoLock scoped_lock(lock_); | 
 |   const FieldTrialKey key(trial_name, group_name); | 
 |   if (ContainsKey(field_trial_params_, key)) | 
 |     return false; | 
 |  | 
 |   field_trial_params_[key] = params; | 
 |   return true; | 
 | } | 
 |  | 
 | bool FieldTrialParamAssociator::GetFieldTrialParams( | 
 |     const std::string& trial_name, | 
 |     FieldTrialParams* params) { | 
 |   FieldTrial* field_trial = FieldTrialList::Find(trial_name); | 
 |   if (!field_trial) | 
 |     return false; | 
 |  | 
 |   // First try the local map, falling back to getting it from shared memory. | 
 |   if (GetFieldTrialParamsWithoutFallback(trial_name, field_trial->group_name(), | 
 |                                          params)) { | 
 |     return true; | 
 |   } | 
 |  | 
 |   // TODO(lawrencewu): add the params to field_trial_params_ for next time. | 
 |   return FieldTrialList::GetParamsFromSharedMemory(field_trial, params); | 
 | } | 
 |  | 
 | bool FieldTrialParamAssociator::GetFieldTrialParamsWithoutFallback( | 
 |     const std::string& trial_name, | 
 |     const std::string& group_name, | 
 |     FieldTrialParams* params) { | 
 |   AutoLock scoped_lock(lock_); | 
 |  | 
 |   const FieldTrialKey key(trial_name, group_name); | 
 |   if (!ContainsKey(field_trial_params_, key)) | 
 |     return false; | 
 |  | 
 |   *params = field_trial_params_[key]; | 
 |   return true; | 
 | } | 
 |  | 
 | void FieldTrialParamAssociator::ClearAllParamsForTesting() { | 
 |   { | 
 |     AutoLock scoped_lock(lock_); | 
 |     field_trial_params_.clear(); | 
 |   } | 
 |   FieldTrialList::ClearParamsFromSharedMemoryForTesting(); | 
 | } | 
 |  | 
 | void FieldTrialParamAssociator::ClearParamsForTesting( | 
 |     const std::string& trial_name, | 
 |     const std::string& group_name) { | 
 |   AutoLock scoped_lock(lock_); | 
 |   const FieldTrialKey key(trial_name, group_name); | 
 |   field_trial_params_.erase(key); | 
 | } | 
 |  | 
 | void FieldTrialParamAssociator::ClearAllCachedParamsForTesting() { | 
 |   AutoLock scoped_lock(lock_); | 
 |   field_trial_params_.clear(); | 
 | } | 
 |  | 
 | }  // namespace base |