diff --git a/crates/librqbit/src/torrent_state/live/mod.rs b/crates/librqbit/src/torrent_state/live/mod.rs index ee2245c..0c583cc 100644 --- a/crates/librqbit/src/torrent_state/live/mod.rs +++ b/crates/librqbit/src/torrent_state/live/mod.rs @@ -214,12 +214,16 @@ impl TorrentStateLive { paused: TorrentStatePaused, fatal_errors_tx: tokio::sync::oneshot::Sender, cancellation_token: CancellationToken, - session_stats: Arc, ) -> anyhow::Result> { let (peer_queue_tx, peer_queue_rx) = unbounded_channel(); - - let down_speed_estimator = SpeedEstimator::new(5); - let up_speed_estimator = SpeedEstimator::new(5); + let session = paused + .info + .session + .upgrade() + .context("session is dead, cannot start torrent")?; + let session_stats = session.stats.atomic.clone(); + let down_speed_estimator = SpeedEstimator::default(); + let up_speed_estimator = SpeedEstimator::default(); let have_bytes = paused.chunk_tracker.get_hns().have_bytes; let lengths = *paused.chunk_tracker.get_lengths(); diff --git a/crates/librqbit/src/torrent_state/mod.rs b/crates/librqbit/src/torrent_state/mod.rs index d602f5b..0feaaf1 100644 --- a/crates/librqbit/src/torrent_state/mod.rs +++ b/crates/librqbit/src/torrent_state/mod.rs @@ -218,6 +218,7 @@ impl ManagedTorrent { .upgrade() .context("session is dead, cannot start torrent")?; let mut g = self.locked.write(); + let cancellation_token = session.cancellation_token().child_token(); let spawn_fatal_errors_receiver = |state: &Arc, @@ -297,7 +298,7 @@ impl ManagedTorrent { drop(g); let t = self.clone(); let span = self.shared().span.clone(); - let token = session.cancellation_token().child_token().clone(); + let token = cancellation_token.clone(); spawn_with_cancel( error_span!(parent: span.clone(), "initialize_and_start"), @@ -326,12 +327,7 @@ impl ManagedTorrent { } let (tx, rx) = tokio::sync::oneshot::channel(); - let live = TorrentStateLive::new( - paused, - tx, - session.cancellation_token().child_token(), - session.stats.atomic.clone(), - )?; + let live = TorrentStateLive::new(paused, tx, cancellation_token)?; g.state = ManagedTorrentState::Live(live.clone()); drop(g); @@ -356,16 +352,11 @@ impl ManagedTorrent { ManagedTorrentState::Paused(_) => { let paused = g.state.take().assert_paused(); let (tx, rx) = tokio::sync::oneshot::channel(); - let live = TorrentStateLive::new( - paused, - tx, - session.cancellation_token().child_token().clone(), - session.stats.atomic.clone(), - )?; + let live = TorrentStateLive::new(paused, tx, cancellation_token.clone())?; g.state = ManagedTorrentState::Live(live.clone()); drop(g); - spawn_fatal_errors_receiver(self, rx, session.cancellation_token().child_token()); + spawn_fatal_errors_receiver(self, rx, cancellation_token); spawn_peer_adder(&live, peer_rx); Ok(()) } diff --git a/crates/librqbit_core/src/speed_estimator.rs b/crates/librqbit_core/src/speed_estimator.rs index 6fbb1c7..953d3b1 100644 --- a/crates/librqbit_core/src/speed_estimator.rs +++ b/crates/librqbit_core/src/speed_estimator.rs @@ -19,6 +19,12 @@ pub struct SpeedEstimator { time_remaining_millis: AtomicU64, } +impl Default for SpeedEstimator { + fn default() -> Self { + Self::new(5) + } +} + impl SpeedEstimator { pub fn new(window_seconds: usize) -> Self { assert!(window_seconds > 1);