Index: base/metrics/field_trial.cc |
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc |
index 78862fa683520bc5d96764e093d7fce54386e12a..4d4fdcebde56b38bec2acb8a44679c61d3bd65aa 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, |
@@ -489,8 +507,13 @@ void FieldTrialList::AllStatesToString(std::string* output) { |
trial.group_name.AppendToString(output); |
output->append(1, kPersistentStringSeparator); |
+ // TODO(asvitkine): Remove these when http://crbug.com/359406 is fixed. |
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()); |
+ } |
} |
} |
@@ -615,10 +638,15 @@ void FieldTrialList::NotifyFieldTrialGroupSelection(FieldTrial* field_trial) { |
if (!field_trial->enable_field_trial_) |
return; |
+ // TODO(asvitkine): Remove this block when http://crbug.com/359406 is fixed. |
{ |
AutoLock auto_lock(global_->lock_); |
CheckTrialGroup(field_trial->trial_name(), |
field_trial->group_name_internal(), &global_->seen_states_); |
+ if (g_use_global_check_states) { |
+ CheckTrialGroup(field_trial->trial_name(), |
+ field_trial->group_name_internal(), &g_seen_states.Get()); |
+ } |
} |
global_->observer_list_->Notify( |
FROM_HERE, &FieldTrialList::Observer::OnFieldTrialGroupFinalized, |