[fix](trx-frontend-http): avoid decode history deadlock

Co-authored-by: OpenAI <assistant@openai.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
2026-02-09 23:31:17 +01:00
parent c24d5d0152
commit 3a739069c0
@@ -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<DecodedMessage>) {
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<broadcast::Receiver<DecodedMessage>> {
ch.as_ref().map(|tx| tx.subscribe())
}
fn start_decode_history_collector() {
fn start_decode_history_collector(tx: broadcast::Sender<DecodedMessage>) {
static STARTED: OnceLock<Mutex<bool>> = 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 {