|  | // 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 |