fn tick()

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);
                }
            }
        }
    }