dc/s2n-quic-dc/src/stream/server/stats/worker.rs (44 lines of code) (raw):

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use super::{Receiver, Stats}; use crate::clock::Clock; use core::time::Duration; use s2n_quic_core::{packet::number::PacketNumberSpace, recovery::RttEstimator}; pub struct Worker { queue: Receiver, stats: Stats, } impl Worker { pub fn new(queue: Receiver, stats: Stats) -> Self { Self { queue, stats } } pub async fn run<C: Clock>(self, clock: C) { let mut rtt_estimator = RttEstimator::new(Duration::from_secs(30)); let debounce = Duration::from_millis(5); let timeout = Duration::from_millis(5); let mut timer = clock.timer(); loop { let Ok(sample) = self.queue.recv_back().await else { break; }; let now = clock.get_time(); rtt_estimator.update_rtt( Duration::ZERO, sample, now, true, PacketNumberSpace::ApplicationData, ); // allow some more samples to come through timer.sleep(clock.get_time() + debounce).await; while let Ok(Some(sample)) = self.queue.try_recv_back() { rtt_estimator.update_rtt( Duration::ZERO, sample, now, true, PacketNumberSpace::ApplicationData, ); } self.stats.update(&rtt_estimator); // wait before taking a new sample to avoid spinning timer.sleep(clock.get_time() + timeout).await; } } }