Index: base/metrics/field_trial.cc |
=================================================================== |
--- base/metrics/field_trial.cc (revision 70854) |
+++ base/metrics/field_trial.cc (working copy) |
@@ -7,7 +7,11 @@ |
#include "base/logging.h" |
#include "base/rand_util.h" |
#include "base/stringprintf.h" |
+#include "base/utf_string_conversions.h" |
+using base::Time; |
+using base::TimeDelta; |
+ |
namespace base { |
// static |
@@ -34,10 +38,18 @@ |
random_(static_cast<Probability>(divisor_ * base::RandDouble())), |
accumulated_group_probability_(0), |
next_group_number_(0), |
- group_(kNotParticipating) { |
+ group_(kNotParticipating), |
+ disable_duration_(base::TimeDelta::FromDays(30)), |
+ disable_field_trail_(false) { |
FieldTrialList::Register(this); |
+ DetermineIfFieldTrailIsToBeDisabled(); |
} |
+void FieldTrial::DetermineIfFieldTrailIsToBeDisabled() { |
+ if (base::Time::NowFromSystemTime() - GetBuildTime() >= disable_duration_) |
+ disable_field_trail_ = true; |
+} |
+ |
int FieldTrial::AppendGroup(const std::string& name, |
Probability group_probability) { |
DCHECK(group_probability <= divisor_); |
@@ -46,8 +58,9 @@ |
if (group_probability == kAllRemainingProbability) { |
accumulated_group_probability_ = divisor_; |
} else { |
- if (enable_benchmarking_) |
+ if (enable_benchmarking_ || disable_field_trail_) |
group_probability = 0; |
+ |
accumulated_group_probability_ += group_probability; |
} |
DCHECK(accumulated_group_probability_ <= divisor_); |
@@ -62,6 +75,11 @@ |
return next_group_number_++; |
} |
+void FieldTrial::SetDisableDuration(const base::TimeDelta& duration) { |
+ disable_duration_ = duration; |
+ DetermineIfFieldTrailIsToBeDisabled(); |
+} |
+ |
// static |
std::string FieldTrial::MakeName(const std::string& name_prefix, |
const std::string& trial_name) { |
@@ -76,6 +94,18 @@ |
enable_benchmarking_ = true; |
} |
+// static |
+Time FieldTrial::GetBuildTime() { |
+ static Time integral_build_time; |
+ if (integral_build_time.is_null()) { |
+ const char* kDateTime = __DATE__ " " __TIME__; |
+ bool result = Time::FromString(ASCIIToWide(kDateTime).c_str(), |
+ &integral_build_time); |
+ DCHECK(result); |
+ } |
+ return integral_build_time; |
+} |
+ |
FieldTrial::~FieldTrial() {} |
//------------------------------------------------------------------------------ |