[fix](trx-server): move heavy decoders off async workers

Run FT8 and WSPR decode steps in blocking sections so the server listener stays responsive under decode load.\n\nCo-authored-by: OpenAI Codex <codex@openai.com>

Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-03-13 06:56:54 +01:00
parent 0179c13000
commit 69fd24577c
+14 -6
View File
@@ -1554,8 +1554,10 @@ pub async fn run_ft8_decoder(
while ft8_buf.len() >= decoder.block_size() {
let block: Vec<f32> = ft8_buf.drain(..decoder.block_size()).collect();
decoder.process_block(&block);
let results = decoder.decode_if_ready(100);
let results = tokio::task::block_in_place(|| {
decoder.process_block(&block);
decoder.decode_if_ready(100)
});
if !results.is_empty() {
for res in results {
let ts_ms = match std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) {
@@ -1678,7 +1680,9 @@ pub async fn run_wspr_decoder(
last_slot = slot;
} else if slot != last_slot {
let base_freq = state_rx.borrow().status.freq.hz;
match decoder.decode_slot(&slot_buf, Some(base_freq)) {
match tokio::task::block_in_place(|| {
decoder.decode_slot(&slot_buf, Some(base_freq))
}) {
Ok(results) => {
for res in results {
let ts_ms = match std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH) {
@@ -1933,8 +1937,10 @@ async fn run_background_ft8_decoder(
while ft8_buf.len() >= decoder.block_size() {
let block: Vec<f32> = ft8_buf.drain(..decoder.block_size()).collect();
decoder.process_block(&block);
let results = decoder.decode_if_ready(100);
let results = tokio::task::block_in_place(|| {
decoder.process_block(&block);
decoder.decode_if_ready(100)
});
for res in results {
let abs_freq_hz = base_freq_hz as f64 + res.freq_hz as f64;
let msg = Ft8Message {
@@ -1994,7 +2000,9 @@ async fn run_background_wspr_decoder(
if last_slot == -1 {
last_slot = slot;
} else if slot != last_slot {
match decoder.decode_slot(&slot_buf, Some(base_freq_hz)) {
match tokio::task::block_in_place(|| {
decoder.decode_slot(&slot_buf, Some(base_freq_hz))
}) {
Ok(results) => {
for res in results {
let msg = WsprMessage {