From fb8573d80676d05da4c42e5d58635dfd3428c6ed Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 6 Jan 2026 05:27:27 -0300 Subject: [PATCH] uvc: use blocking event reads by default --- server/src/bin/lesavka-uvc.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/server/src/bin/lesavka-uvc.rs b/server/src/bin/lesavka-uvc.rs index bdeda4e..fbf9385 100644 --- a/server/src/bin/lesavka-uvc.rs +++ b/server/src/bin/lesavka-uvc.rs @@ -108,6 +108,8 @@ fn main() -> Result<()> { let debug = env::var("LESAVKA_UVC_DEBUG").is_ok(); let mut setup_seen: u64 = 0; let mut data_seen: u64 = 0; + let mut dq_err_seen: u64 = 0; + let mut dq_err_last: Option = None; loop { let file = open_with_retry(&dev)?; @@ -133,6 +135,14 @@ fn main() -> Result<()> { let err = std::io::Error::last_os_error(); match err.raw_os_error() { Some(libc::EAGAIN) | Some(libc::EINTR) | Some(libc::ENOENT) => { + if debug { + let code = err.raw_os_error(); + if dq_err_seen < 10 || code != dq_err_last { + eprintln!("[lesavka-uvc] dqevent idle: {err}"); + dq_err_seen += 1; + dq_err_last = code; + } + } thread::sleep(Duration::from_millis(10)); continue; } @@ -188,7 +198,11 @@ fn main() -> Result<()> { } handle_data(fd, uvc_send_response, &mut state, &mut pending, data); } - _ => {} + _ => { + if debug { + eprintln!("[lesavka-uvc] event type=0x{:08x}", ev.type_); + } + } } } } @@ -255,12 +269,12 @@ impl UvcState { fn open_with_retry(path: &str) -> Result { for attempt in 1..=200 { - match OpenOptions::new() - .read(true) - .write(true) - .custom_flags(libc::O_NONBLOCK) - .open(path) - { + let mut opts = OpenOptions::new(); + opts.read(true).write(true); + if env::var("LESAVKA_UVC_NONBLOCK").is_ok() { + opts.custom_flags(libc::O_NONBLOCK); + } + match opts.open(path) { Ok(f) => { eprintln!("[lesavka-uvc] opened {path} (attempt {attempt})"); return Ok(f);