--- a/src/main.rs +++ b/src/main.rs @@ -24,6 +24,7 @@ use redox_driver_sys::pcid_client::PcidClient; use redox_driver_sys::quirks::PciQuirkFlags; use redox_scheme::{SignalBehavior, Socket}; +use syscall04::error::EBADF; use crate::driver::{DriverError, DriverEvent, GpuDriver, Result}; use crate::drivers::DriverRegistry; @@ -102,10 +103,13 @@ fn run() -> Result<()> { let event_scheme = drm_scheme.clone(); std::thread::spawn(move || loop { - if let Ok(event) = event_rx.recv() { - if let Ok(mut scheme) = event_scheme.lock() { - scheme.handle_driver_event(event); - } + let Ok(event) = event_rx.recv() else { + info!("redox-drm: event producer dropped, stopping driver event thread"); + break; + }; + + if let Ok(mut scheme) = event_scheme.lock() { + scheme.handle_driver_event(event); } }); @@ -118,6 +122,10 @@ fn run() -> Result<()> { break; } Err(e) => { + if e.errno == EBADF { + info!("redox-drm: scheme fd closed, exiting"); + break; + } error!("redox-drm: failed to receive scheme request: {}", e); continue; } @@ -145,6 +153,10 @@ fn run() -> Result<()> { }; if let Err(e) = socket.write_response(response, SignalBehavior::Restart) { + if e.errno == EBADF { + info!("redox-drm: scheme fd closed while writing response, exiting"); + break; + } error!("redox-drm: failed to write scheme response: {}", e); } }