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