diff --git a/e1000d/src/main.rs b/e1000d/src/main.rs index 755bff8d89..a2e88466e8 100644 --- a/e1000d/src/main.rs +++ b/e1000d/src/main.rs @@ -7,7 +7,7 @@ extern crate syscall; use std::cell::RefCell; use std::env; use std::fs::File; -use std::io::{Read, Write, Result}; +use std::io::{ErrorKind, Read, Write, Result}; use std::os::unix::io::{AsRawFd, FromRawFd, RawFd}; use std::sync::Arc; @@ -17,7 +17,7 @@ use syscall::{Packet, SchemeBlockMut, PHYSMAP_NO_CACHE, PHYSMAP_WRITE}; pub mod device; -fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut Vec) -> Result<()> { +fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut Vec) -> Result { // Handle any blocked packets let mut i = 0; while i < todo.len() { @@ -33,8 +33,14 @@ fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut // Check that the socket is empty loop { let mut packet = Packet::default(); - if socket.read(&mut packet)? == 0 { - break; + match socket.read(&mut packet) { + Ok(0) => return Ok(true), + Ok(_) => (), + Err(err) => if err.kind() == ErrorKind::WouldBlock { + break; + } else { + return Err(err); + } } if let Some(a) = device.handle(&packet) { @@ -45,7 +51,7 @@ fn handle_update(socket: &mut File, device: &mut device::Intel8254x, todo: &mut } } - Ok(()) + Ok(false) } fn main() { @@ -88,7 +94,9 @@ fn main() { if unsafe { device_irq.borrow().irq() } { irq_file.write(&mut irq)?; - handle_update(&mut socket_irq.borrow_mut(), &mut device_irq.borrow_mut(), &mut todo_irq.borrow_mut())?; + if handle_update(&mut socket_irq.borrow_mut(), &mut device_irq.borrow_mut(), &mut todo_irq.borrow_mut())? { + return Ok(Some(0)) + } let next_read = device_irq.borrow().next_read(); if next_read > 0 { @@ -101,7 +109,9 @@ fn main() { let device_packet = device.clone(); let socket_packet = socket.clone(); event_queue.add(socket_fd as RawFd, move |_event| -> Result> { - handle_update(&mut socket_packet.borrow_mut(), &mut device_packet.borrow_mut(), &mut todo.borrow_mut()); + if handle_update(&mut socket_packet.borrow_mut(), &mut device_packet.borrow_mut(), &mut todo.borrow_mut())? { + return Ok(Some(0)); + } let next_read = device_packet.borrow().next_read(); if next_read > 0 { @@ -135,6 +145,9 @@ fn main() { loop { let event_count = event_queue.run().expect("e1000d: failed to handle events"); + if event_count == 0 { + break; + } send_events(event_count); } }