aboutsummaryrefslogtreecommitdiff
path: root/externals/discord-rpc/src/backoff.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/discord-rpc/src/backoff.h')
-rw-r--r--externals/discord-rpc/src/backoff.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/externals/discord-rpc/src/backoff.h b/externals/discord-rpc/src/backoff.h
new file mode 100644
index 0000000000..a3e736fb7b
--- /dev/null
+++ b/externals/discord-rpc/src/backoff.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <algorithm>
+#include <random>
+#include <stdint.h>
+#include <time.h>
+
+struct Backoff {
+ int64_t minAmount;
+ int64_t maxAmount;
+ int64_t current;
+ int fails;
+ std::mt19937_64 randGenerator;
+ std::uniform_real_distribution<> randDistribution;
+
+ double rand01() { return randDistribution(randGenerator); }
+
+ Backoff(int64_t min, int64_t max)
+ : minAmount(min)
+ , maxAmount(max)
+ , current(min)
+ , fails(0)
+ , randGenerator((uint64_t)time(0))
+ {
+ }
+
+ void reset()
+ {
+ fails = 0;
+ current = minAmount;
+ }
+
+ int64_t nextDelay()
+ {
+ ++fails;
+ int64_t delay = (int64_t)((double)current * 2.0 * rand01());
+ current = std::min(current + delay, maxAmount);
+ return current;
+ }
+};