blob: 8208a748eac2a61a99ae202bbaa1091bd8ee4e31 [file] [log] [blame]
//===- llvm/Support/ExponentialBackoff.h ------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file defines a helper class for implementing exponential backoff.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_EXPONENTIALBACKOFF_H
#define LLVM_EXPONENTIALBACKOFF_H
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/Error.h"
#include <chrono>
#include <random>
namespace llvm {
/// A class to help implement exponential backoff.
///
/// Example usage:
/// \code
/// ExponentialBackoff Backoff(10s);
/// do {
/// if (tryToDoSomething())
/// return ItWorked;
/// } while (Backoff.waitForNextAttempt());
/// return Timeout;
/// \endcode
class ExponentialBackoff {
public:
using duration = std::chrono::steady_clock::duration;
using time_point = std::chrono::steady_clock::time_point;
/// \param Timeout the maximum wall time this should run for starting when
/// this object is constructed.
/// \param MinWait the minimum amount of time `waitForNextAttempt` will sleep
/// for.
/// \param MaxWait the maximum amount of time `waitForNextAttempt` will sleep
/// for.
ExponentialBackoff(duration Timeout,
duration MinWait = std::chrono::milliseconds(10),
duration MaxWait = std::chrono::milliseconds(500))
: MinWait(MinWait), MaxWait(MaxWait),
EndTime(std::chrono::steady_clock::now() + Timeout) {}
/// Blocks while waiting for the next attempt.
/// \returns true if you should try again, false if the timeout has been
/// reached.
bool waitForNextAttempt();
private:
duration MinWait;
duration MaxWait;
time_point EndTime;
std::random_device RandDev;
int64_t CurrentMultiplier = 1;
};
} // end namespace llvm
#endif // LLVM_EXPONENTIALBACKOFF_H