Files
clang-r547379/include/llvm/Support/ExponentialBackoff.h
Ryan Prichard 6024e5c395 Update prebuilt Clang to r547379 (20.0.0).
clang 20.0.0 (based on r547379) from build 12806354.

Bug: http://b/379133546
Test: N/A
Change-Id: I2eb8938af55d809de674be63cb30cf27e801862b

Upstream-Commit: ad834e67b1105d15ef907f6255d4c96e8e733f57
2025-11-26 14:59:46 -05:00

66 lines
2.1 KiB
C++

//===- 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