From 3a739069c0352fe3bd7635bd3c99f4c96a3cfa5e Mon Sep 17 00:00:00 2001 From: Stanislaw Grams Date: Mon, 9 Feb 2026 23:31:17 +0100 Subject: [PATCH] [fix](trx-frontend-http): avoid decode history deadlock Co-authored-by: OpenAI Signed-off-by: Stanislaw Grams --- .../trx-frontend-http/src/audio.rs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs b/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs index e2ba45a..0bf47d9 100644 --- a/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs +++ b/src/trx-client/trx-frontend/trx-frontend-http/src/audio.rs @@ -148,11 +148,13 @@ pub fn clear_ft8_history() { /// Set the decode broadcast channel from the client main. pub fn set_decode_channel(tx: broadcast::Sender) { - let mut ch = decode_channel() - .lock() - .expect("decode channel mutex poisoned"); - *ch = Some(tx); - start_decode_history_collector(); + { + let mut ch = decode_channel() + .lock() + .expect("decode channel mutex poisoned"); + *ch = Some(tx.clone()); + } + start_decode_history_collector(tx); } /// Subscribe to the decode broadcast channel, if available. @@ -163,7 +165,7 @@ pub fn subscribe_decode() -> Option> { ch.as_ref().map(|tx| tx.subscribe()) } -fn start_decode_history_collector() { +fn start_decode_history_collector(tx: broadcast::Sender) { static STARTED: OnceLock> = OnceLock::new(); let started = STARTED.get_or_init(|| Mutex::new(false)); let mut started_guard = started.lock().expect("decode history start mutex poisoned"); @@ -172,13 +174,6 @@ fn start_decode_history_collector() { } *started_guard = true; - let ch = decode_channel() - .lock() - .expect("decode channel mutex poisoned"); - let Some(tx) = ch.as_ref().cloned() else { - return; - }; - tokio::spawn(async move { let mut rx = tx.subscribe(); loop {