123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // Copyright 2015 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "remoting/host/backoff_timer.h"
- #include <memory>
- #include <utility>
- #include "base/bind.h"
- namespace remoting {
- BackoffTimer::BackoffTimer() = default;
- BackoffTimer::~BackoffTimer() = default;
- void BackoffTimer::Start(const base::Location& posted_from,
- base::TimeDelta delay,
- base::TimeDelta max_delay,
- const base::RepeatingClosure& user_task) {
- backoff_policy_.multiply_factor = 2;
- backoff_policy_.initial_delay_ms = delay.InMilliseconds();
- backoff_policy_.maximum_backoff_ms = max_delay.InMilliseconds();
- backoff_policy_.entry_lifetime_ms = -1;
- backoff_entry_ = std::make_unique<net::BackoffEntry>(&backoff_policy_);
- posted_from_ = posted_from;
- user_task_ = user_task;
- StartTimer();
- }
- void BackoffTimer::Stop() {
- timer_.Stop();
- user_task_.Reset();
- backoff_entry_.reset();
- }
- void BackoffTimer::StartTimer() {
- timer_.Start(
- posted_from_, backoff_entry_->GetTimeUntilRelease(),
- base::BindOnce(&BackoffTimer::OnTimerFired, base::Unretained(this)));
- }
- void BackoffTimer::OnTimerFired() {
- DCHECK(IsRunning());
- DCHECK(!user_task_.is_null());
- backoff_entry_->InformOfRequest(false);
- StartTimer();
- // Running the user task may destroy this object, so don't reference
- // any fields of this object after running it.
- base::RepeatingClosure user_task(user_task_);
- user_task.Run();
- }
- } // namespace remoting
|