in ratelimiter/src/lib.rs [115:147]
fn tick(&self) {
let now = Instant::<Nanoseconds<u64>>::now();
let next = self.next.load(Ordering::Relaxed);
if now >= next {
let strategy = Refill::try_from(self.strategy.load(Ordering::Relaxed));
let tick = match strategy {
Ok(Refill::Smooth) => self.tick.load(Ordering::Relaxed).as_nanos() as u64,
Ok(Refill::Uniform) => self.uniform.sample(&mut rand::thread_rng()) as u64,
Ok(Refill::Normal) => self.normal.sample(&mut rand::thread_rng()) as u64,
Err(_) => self.tick.load(Ordering::Relaxed).as_nanos() as u64,
};
if self
.next
.compare_exchange(
next,
next + Duration::<Nanoseconds<u64>>::from_nanos(tick),
Ordering::SeqCst,
Ordering::SeqCst,
)
.is_ok()
{
let quantum = self.quantum.load(Ordering::Relaxed);
let capacity = self.capacity.load(Ordering::Relaxed);
let available = self.available.load(Ordering::Relaxed);
if available + quantum >= capacity {
let quantum = capacity - available;
self.available.fetch_add(quantum, Ordering::Relaxed);
} else {
self.available.fetch_add(quantum, Ordering::Relaxed);
}
}
}
}