text: // 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.
  
  #ifndef REMOTING_HOST_BACKOFF_TIMER_H_
  #define REMOTING_HOST_BACKOFF_TIMER_H_
  
  #include <memory>
  
  #include "base/callback.h"
  #include "base/macros.h"
  #include "base/timer/timer.h"
  #include "net/base/backoff_entry.h"
  
  namespace remoting {
  
  // An object similar to a base::Timer with exponential backoff.
  class BackoffTimer {
   public:
    BackoffTimer();
  
    BackoffTimer(const BackoffTimer&) = delete;
    BackoffTimer& operator=(const BackoffTimer&) = delete;
  
    ~BackoffTimer();
  
    // Invokes |user_task| at intervals specified by |delay|, and
    // increasing up to |max_delay|.  Always invokes |user_task| before
    // the first scheduled delay.
    void Start(const base::Location& posted_from,
               base::TimeDelta delay,
               base::TimeDelta max_delay,
               const base::RepeatingClosure& user_task);
  
    // Prevents the user task from being invoked again.
    void Stop();
  
    // Returns true if the user task may be invoked in the future.
    bool IsRunning() const { return !!backoff_entry_; }
  
   private:
    void StartTimer();
    void OnTimerFired();
  
    base::OneShotTimer timer_;
    base::RepeatingClosure user_task_;
    base::Location posted_from_;
    net::BackoffEntry::Policy backoff_policy_ = {};
    std::unique_ptr<net::BackoffEntry> backoff_entry_;
  };
  
  }  // namespace remoting
  
  #endif  // REMOTING_HOST_BACKOFF_TIMER_H_
  