From cd367faec21a9eb45774b158ae37097215021f31 Mon Sep 17 00:00:00 2001 From: Hachi-R Date: Fri, 11 Apr 2025 13:46:41 -0300 Subject: [PATCH] fix: oneshot channel --- rust_rpc/src/main.rs | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/rust_rpc/src/main.rs b/rust_rpc/src/main.rs index 958708ba..5fba6ad4 100644 --- a/rust_rpc/src/main.rs +++ b/rust_rpc/src/main.rs @@ -422,6 +422,8 @@ impl Downloader { let progress_clone = progress.bar.clone(); let filename = real_filename.clone(); + let (log_cancel_tx, mut log_cancel_rx) = tokio::sync::oneshot::channel(); + let log_task = tokio::spawn(async move { let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(1)); let tracker = ProgressTracker { @@ -429,22 +431,28 @@ impl Downloader { }; loop { - interval.tick().await; - if let Some(stats) = tracker.get_stats() { - let json_output = json!({ - "progress": stats.progress_percent, - "speed_bps": stats.speed_bytes_per_sec, - "downloaded_bytes": stats.bytes_downloaded, - "total_bytes": stats.total_size, - "eta_seconds": stats.eta_seconds, - "elapsed_seconds": stats.elapsed_seconds, - "filename": filename - }); - println!("{}", json_output); + tokio::select! { + _ = interval.tick() => { + if let Some(stats) = tracker.get_stats() { + let json_output = json!({ + "progress": stats.progress_percent, + "speed_bps": stats.speed_bytes_per_sec, + "downloaded_bytes": stats.bytes_downloaded, + "total_bytes": stats.total_size, + "eta_seconds": stats.eta_seconds, + "elapsed_seconds": stats.elapsed_seconds, + "filename": filename + }); + println!("{}", json_output); + } + } + _ = &mut log_cancel_rx => { + break; + } } } }); - Some(log_task) + Some((log_task, log_cancel_tx)) } else { None }; @@ -499,8 +507,9 @@ impl Downloader { progress.finish(); - if let Some(log_handle) = log_progress { - log_handle.abort(); + if let Some((log_handle, log_cancel_tx)) = log_progress { + let _ = log_cancel_tx.send(()); + let _ = log_handle.await; } let manager = resume_manager.lock().await;