double m_rate;
double m_burst;
double m_tokens = 0.0;
- mutex m_mutex;
+ mutable mutex m_mutex;
void update_tokens();
RateLimiter() = delete;
double sleep_time(double cost = 1.0);
bool is_ready();
void borrow(double cost = 1.0);
+ void rate(double new_rate);
+ double rate() const;
};
class RateEstimator {
// Read count
uint64_t count() const;
+ /// Increment count (like update(count() + more), but atomic)
+ void increment(uint64_t more = 1);
+
// Convert counts to chrono types
chrono::high_resolution_clock::time_point time_point(uint64_t absolute_count) const;
chrono::duration<double> duration(uint64_t relative_count) const;
m_rate(rate),
m_burst(burst)
{
+ THROW_CHECK1(invalid_argument, m_rate, m_rate > 0);
+ THROW_CHECK1(invalid_argument, m_burst, m_burst >= 0);
}
RateLimiter::RateLimiter(double rate) :
m_rate(rate),
m_burst(rate)
{
+ THROW_CHECK1(invalid_argument, m_rate, m_rate > 0);
+ THROW_CHECK1(invalid_argument, m_burst, m_burst >= 0);
}
void
double
RateLimiter::sleep_time(double cost)
{
+ THROW_CHECK1(invalid_argument, m_rate, m_rate > 0);
borrow(cost);
unique_lock<mutex> lock(m_mutex);
update_tokens();
m_tokens -= cost;
}
+ void
+ RateLimiter::rate(double const new_rate)
+ {
+ THROW_CHECK1(invalid_argument, new_rate, new_rate > 0);
+ unique_lock<mutex> lock(m_mutex);
+ m_rate = new_rate;
+ }
+
+ double
+ RateLimiter::rate() const
+ {
+ unique_lock<mutex> lock(m_mutex);
+ return m_rate;
+ }
+
RateEstimator::RateEstimator(double min_delay, double max_delay) :
m_min_delay(min_delay),
m_max_delay(max_delay)
}
}
+ void
+ RateEstimator::increment(const uint64_t more)
+ {
+ unique_lock<mutex> lock(m_mutex);
+ return update_unlocked(m_last_count + more);
+ }
+
uint64_t
RateEstimator::count() const
{