blob: eac021854985ed93aeeaf616395effa1df2e9596 [file] [log] [blame]
// Copyright 2012 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "google/cacheinvalidation/impl/exponential-backoff-delay-generator.h"
namespace invalidation {
TimeDelta ExponentialBackoffDelayGenerator::GetNextDelay() {
TimeDelta delay = Scheduler::NoDelay(); // After a reset, delay is zero.
if (in_retry_mode) {
// We used to multiply the current_max_delay_ by the double, but this
// implicitly truncated the double to an integer, which would always be 0.
// By converting to and from milliseconds, we avoid this problem.
delay = TimeDelta::FromMilliseconds(
random_->RandDouble() * current_max_delay_.InMilliseconds());
// Adjust the max for the next run.
TimeDelta max_delay = initial_max_delay_ * max_exponential_factor_;
if (current_max_delay_ <= max_delay) { // Guard against overflow.
current_max_delay_ *= 2;
if (current_max_delay_ > max_delay) {
current_max_delay_ = max_delay;
}
}
}
in_retry_mode = true;
return delay;
}
}