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,8 +38,11 @@ |
random_(static_cast<Probability>(divisor_ * base::RandDouble())), |
accumulated_group_probability_(0), |
next_group_number_(0), |
- group_(kNotParticipating) { |
+ group_(kNotParticipating), |
+ all_remaining_probability_set_(false), |
+ usage_timeout_(base::TimeDelta::FromDays(30)) { |
FieldTrialList::Register(this); |
+ disable_field_trial_ = ShouldFieldTrialBeDisabled(usage_timeout_); |
} |
int FieldTrial::AppendGroup(const std::string& name, |
@@ -45,9 +52,11 @@ |
group_probability == kAllRemainingProbability); |
if (group_probability == kAllRemainingProbability) { |
accumulated_group_probability_ = divisor_; |
+ all_remaining_probability_set_ = true; |
} else { |
- if (enable_benchmarking_) |
+ if (enable_benchmarking_ || disable_field_trial_) |
group_probability = 0; |
+ |
accumulated_group_probability_ += group_probability; |
} |
DCHECK(accumulated_group_probability_ <= divisor_); |
@@ -62,6 +71,11 @@ |
return next_group_number_++; |
} |
+void FieldTrial::SetUsageTimeout(const base::TimeDelta& usage_timeout) { |
+ usage_timeout_ = usage_timeout; |
+ disable_field_trial_ = ShouldFieldTrialBeDisabled(usage_timeout); |
+} |
+ |
// static |
std::string FieldTrial::MakeName(const std::string& name_prefix, |
const std::string& trial_name) { |
@@ -76,6 +90,26 @@ |
enable_benchmarking_ = true; |
} |
+// static |
+bool FieldTrial::ShouldFieldTrialBeDisabled( |
+ const base::TimeDelta& usage_timeout) { |
+ if (base::Time::NowFromSystemTime() - GetBuildTime() >= usage_timeout) |
+ return true; |
+ return false; |
+} |
+ |
+// 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() {} |
//------------------------------------------------------------------------------ |
@@ -197,7 +231,7 @@ |
} |
const int kTotalProbability = 100; |
field_trial = new FieldTrial(name, kTotalProbability); |
- field_trial->AppendGroup(group_name, kTotalProbability); |
+ field_trial->AppendGroup(group_name, FieldTrial::kAllRemainingProbability); |
} |
return true; |
} |