LLVM 20.0.0git
ExponentialBackoff.h
Go to the documentation of this file.
1//===- llvm/Support/ExponentialBackoff.h ------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines a helper class for implementing exponential backoff.
10//
11//===----------------------------------------------------------------------===//
12#ifndef LLVM_EXPONENTIALBACKOFF_H
13#define LLVM_EXPONENTIALBACKOFF_H
14
15#include "llvm/ADT/STLExtras.h"
16#include "llvm/Support/Error.h"
17#include <chrono>
18#include <random>
19
20namespace llvm {
21
22/// A class to help implement exponential backoff.
23///
24/// Example usage:
25/// \code
26/// ExponentialBackoff Backoff(10s);
27/// do {
28/// if (tryToDoSomething())
29/// return ItWorked;
30/// } while (Backoff.waitForNextAttempt());
31/// return Timeout;
32/// \endcode
34public:
35 using duration = std::chrono::steady_clock::duration;
36 using time_point = std::chrono::steady_clock::time_point;
37
38 /// \param Timeout the maximum wall time this should run for starting when
39 /// this object is constructed.
40 /// \param MinWait the minimum amount of time `waitForNextAttempt` will sleep
41 /// for.
42 /// \param MaxWait the maximum amount of time `waitForNextAttempt` will sleep
43 /// for.
45 duration MinWait = std::chrono::milliseconds(10),
46 duration MaxWait = std::chrono::milliseconds(500))
47 : MinWait(MinWait), MaxWait(MaxWait),
48 EndTime(std::chrono::steady_clock::now() + Timeout) {}
49
50 /// Blocks while waiting for the next attempt.
51 /// \returns true if you should try again, false if the timeout has been
52 /// reached.
53 bool waitForNextAttempt();
54
55private:
56 duration MinWait;
57 duration MaxWait;
58 time_point EndTime;
59 std::random_device RandDev;
60 int64_t CurrentMultiplier = 1;
61};
62
63} // end namespace llvm
64
65#endif // LLVM_EXPONENTIALBACKOFF_H
static sys::TimePoint< std::chrono::seconds > now(bool Deterministic)
This file contains some templates that are useful if you are working with the STL at all.
A class to help implement exponential backoff.
bool waitForNextAttempt()
Blocks while waiting for the next attempt.
std::chrono::steady_clock::duration duration
ExponentialBackoff(duration Timeout, duration MinWait=std::chrono::milliseconds(10), duration MaxWait=std::chrono::milliseconds(500))
std::chrono::steady_clock::time_point time_point
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858