Chromium Code Reviews| Index: base/metrics/field_trial.cc |
| diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc |
| index 78862fa683520bc5d96764e093d7fce54386e12a..364674f54e3cbd22becebecb6c7af7d0a63149b6 100644 |
| --- a/base/metrics/field_trial.cc |
| +++ b/base/metrics/field_trial.cc |
| @@ -7,6 +7,7 @@ |
| #include <algorithm> |
| #include "base/build_time.h" |
| +#include "base/lazy_instance.h" |
| #include "base/logging.h" |
| #include "base/rand_util.h" |
| #include "base/strings/string_util.h" |
| @@ -115,6 +116,17 @@ void CheckTrialGroup(const std::string& trial_name, |
| } |
| } |
| +// A second copy of FieldTrialList::seen_states_ that is meant to outlive the |
| +// FieldTrialList object to determine if the inconsistency happens because there |
| +// might be multiple FieldTrialList objects. |
| +// TODO(asvitkine): Remove when crbug.com/359406 is resolved. |
| +base::LazyInstance<std::map<std::string, std::string>>::Leaky g_seen_states = |
| + LAZY_INSTANCE_INITIALIZER; |
| + |
| +// Tracks whether |g_seen_states| is used. Defaults to false, because unit tests |
| +// will create multiple FieldTrialList instances. |
| +bool g_use_global_check_states = false; |
| + |
| } // namespace |
| // statics |
| @@ -338,6 +350,12 @@ FieldTrialList::~FieldTrialList() { |
| } |
| // static |
| +void FieldTrialList::EnableGlobalStateChecks() { |
| + CHECK(!g_use_global_check_states); |
| + g_use_global_check_states = true; |
| +} |
| + |
| +// static |
| FieldTrial* FieldTrialList::FactoryGetFieldTrial( |
| const std::string& trial_name, |
| FieldTrial::Probability total_probability, |
| @@ -491,6 +509,10 @@ void FieldTrialList::AllStatesToString(std::string* output) { |
| CheckTrialGroup(trial.trial_name.as_string(), trial.group_name.as_string(), |
| &global_->seen_states_); |
| + if (g_use_global_check_states) { |
| + CheckTrialGroup(trial.trial_name.as_string(), |
| + trial.group_name.as_string(), &g_seen_states.Get()); |
| + } |
| } |
| } |
| @@ -619,6 +641,10 @@ void FieldTrialList::NotifyFieldTrialGroupSelection(FieldTrial* field_trial) { |
| AutoLock auto_lock(global_->lock_); |
| CheckTrialGroup(field_trial->trial_name(), |
| field_trial->group_name_internal(), &global_->seen_states_); |
| + if (g_use_global_check_states) { |
|
Nico
2016/04/15 19:00:31
should this block have a comment too?
Alexei Svitkine (slow)
2016/04/15 20:28:45
Done.
|
| + CheckTrialGroup(field_trial->trial_name(), |
| + field_trial->group_name_internal(), &g_seen_states.Get()); |
| + } |
| } |
| global_->observer_list_->Notify( |
| FROM_HERE, &FieldTrialList::Observer::OnFieldTrialGroupFinalized, |