From 7ac8b3f71bb887204ba60c3e66aed18271dad86b Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 17 Jun 2025 23:13:13 -0500 Subject: [PATCH] server fix --- server/src/main.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index cf3fafb..15f9e42 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -2,7 +2,7 @@ // sever/src/main.rs #![forbid(unsafe_code)] -use std::{pin::Pin, sync::Arc, panic::AssertUnwindSafe}; +use std::{io::ErrorKind, pin::Pin, sync::Arc, panic::AssertUnwindSafe}; use tokio::{fs::{File, OpenOptions}, io::AsyncWriteExt, sync::Mutex}; use tokio_stream::{wrappers::ReceiverStream, Stream, StreamExt}; use tonic::{transport::Server, Request, Response, Status}; @@ -54,8 +54,18 @@ impl Relay for Handler { tokio::spawn(async move { let mut s = req.into_inner(); while let Some(pkt) = s.next().await.transpose()? { - ms.lock().await.write_all(&pkt.data).await?; - tx.send(Ok(pkt)).await;//.ok(); + loop { + match ms.lock().await.write_all(&pkt.data).await { + Ok(()) => break, + Err(e) if e.kind() == ErrorKind::WouldBlock => { + // gadget FIFO full – give it a breath + tokio::time::sleep(std::time::Duration::from_micros(500)).await; + continue; + } + Err(e) => return Err(Status::internal(format!("hidg1: {e}"))), + } + } + let _ = tx.send(Ok(pkt)).await; } Ok::<(), Status>(()) }); @@ -88,14 +98,14 @@ async fn main() -> anyhow::Result<()> { let kb = OpenOptions::new() .write(true) // .read(true) - .custom_flags(libc::O_NONBLOCK) + // .custom_flags(libc::O_NONBLOCK) .open("/dev/hidg0") .await?; let ms = OpenOptions::new() .write(true) // .read(true) - .custom_flags(libc::O_NONBLOCK) + // .custom_flags(libc::O_NONBLOCK) .open("/dev/hidg1") .await?;