| Index: net/base/backoff_entry.cc
|
| diff --git a/net/base/backoff_entry.cc b/net/base/backoff_entry.cc
|
| index bfcc9dd67d6b16f6e1708aad5ff33e5740595d98..a7617b6c6d8aff8f947750a29b07bd3b15565785 100644
|
| --- a/net/base/backoff_entry.cc
|
| +++ b/net/base/backoff_entry.cc
|
| @@ -142,11 +142,25 @@ base::TimeTicks BackoffEntry::CalculateReleaseTime() const {
|
| delay_ms -= base::RandDouble() * policy_->jitter_factor * delay_ms;
|
|
|
| // Do overflow checking in microseconds, the internal unit of TimeTicks.
|
| + base::internal::CheckedNumeric<int64> time_until_release_us = delay_ms + 0.5;
|
| + time_until_release_us *= base::Time::kMicrosecondsPerMillisecond;
|
| + base::TimeDelta time_until_release = base::TimeDelta::FromMicroseconds(
|
| + time_until_release_us.ValueOrDefault(kint64max));
|
| + base::TimeTicks release_time =
|
| + TimeUntilReleaseToReleaseTime(time_until_release);
|
| +
|
| + // Never reduce previously set release horizon, e.g. due to Retry-After
|
| + // header.
|
| + return std::max(release_time, exponential_backoff_release_time_);
|
| +}
|
| +
|
| +base::TimeTicks BackoffEntry::TimeUntilReleaseToReleaseTime(
|
| + base::TimeDelta time_until_release) const {
|
| const int64 kTimeTicksNowUs =
|
| (GetTimeTicksNow() - base::TimeTicks()).InMicroseconds();
|
| + // Do overflow checking in microseconds, the internal unit of TimeTicks.
|
| base::internal::CheckedNumeric<int64> calculated_release_time_us =
|
| - delay_ms + 0.5;
|
| - calculated_release_time_us *= base::Time::kMicrosecondsPerMillisecond;
|
| + time_until_release.InMicroseconds();
|
| calculated_release_time_us += kTimeTicksNowUs;
|
|
|
| base::internal::CheckedNumeric<int64> maximum_release_time_us = kint64max;
|
| @@ -162,11 +176,7 @@ base::TimeTicks BackoffEntry::CalculateReleaseTime() const {
|
| calculated_release_time_us.ValueOrDefault(kint64max),
|
| maximum_release_time_us.ValueOrDefault(kint64max));
|
|
|
| - // Never reduce previously set release horizon, e.g. due to Retry-After
|
| - // header.
|
| - return std::max(
|
| - base::TimeTicks() + base::TimeDelta::FromMicroseconds(release_time_us),
|
| - exponential_backoff_release_time_);
|
| + return base::TimeTicks() + base::TimeDelta::FromMicroseconds(release_time_us);
|
| }
|
|
|
| base::TimeTicks BackoffEntry::GetTimeTicksNow() const {
|
|
|