From 80ed3c47d1e71dc5e9e29a302a7ba86fbb189452 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Fri, 7 Mar 2025 16:13:47 +0100 Subject: [PATCH] Use inner loop to handle multiple reqs per event. --- src/exec.rs | 8 ++++++-- src/procmgr.rs | 51 +++++++++++++++++++++++++++----------------------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/exec.rs b/src/exec.rs index a82b006ff3..bbb012eb2f 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -13,10 +13,14 @@ impl log::Log for Logger { metadata.level() <= log::max_level() } fn log(&self, record: &log::Record) { - let module = record.module_path().unwrap_or(""); + let file = record.file().unwrap_or(""); + let line = record.line().unwrap_or(0); let level = record.level(); let msg = record.args(); - let _ = syscall::write(1, alloc::format!("[{module} {level}] {msg}\n").as_bytes()); + let _ = syscall::write( + 1, + alloc::format!("[{file}:{line} {level}] {msg}\n").as_bytes(), + ); } fn flush(&self) {} } diff --git a/src/procmgr.rs b/src/procmgr.rs index 25639d7e8f..e4073d4a38 100644 --- a/src/procmgr.rs +++ b/src/procmgr.rs @@ -53,7 +53,7 @@ pub fn run(write_fd: usize, auth: &FdGuard) { let mut new_awoken = VecDeque::new(); 'outer: loop { - log::trace!("{awoken:#?}"); + log::trace!("AWOKEN {awoken:#?}"); while !awoken.is_empty() || !new_awoken.is_empty() { awoken.append(&mut new_awoken); for awoken in awoken.drain(..) { @@ -82,29 +82,33 @@ pub fn run(write_fd: usize, auth: &FdGuard) { let event = queue.next_event().expect("failed to get next event"); if event.data == socket_ident { - let req = loop { - match socket.next_request(SignalBehavior::Interrupt) { - Ok(None) => break 'outer, - Ok(Some(req)) => break req, - Err(e) if e.errno == EINTR => continue, - // spurious event - Err(e) if e.errno == EWOULDBLOCK || e.errno == EAGAIN => continue 'outer, - Err(other) => { - panic!("bootstrap: failed to read scheme request from kernel: {other}") + 'reqs: loop { + let req = loop { + match socket.next_request(SignalBehavior::Interrupt) { + Ok(None) => break 'outer, + Ok(Some(req)) => break req, + Err(e) if e.errno == EINTR => continue, + // spurious event + Err(e) if e.errno == EWOULDBLOCK || e.errno == EAGAIN => break 'reqs, + Err(other) => { + panic!("bootstrap: failed to read scheme request from kernel: {other}") + } } - } - }; - let Ready(resp) = handle_scheme(req, &socket, &mut scheme, &mut states, &mut awoken) - else { - continue 'outer; - }; - loop { - match socket.write_response(resp, SignalBehavior::Interrupt) { - Ok(false) => break 'outer, - Ok(_) => break, - Err(err) if err.errno == EINTR => continue, - Err(err) => { - panic!("bootstrap: failed to write scheme response to kernel: {err}") + }; + log::trace!("REQ{req:#?}"); + let Ready(resp) = + handle_scheme(req, &socket, &mut scheme, &mut states, &mut awoken) + else { + continue 'reqs; + }; + loop { + match socket.write_response(resp, SignalBehavior::Interrupt) { + Ok(false) => break 'outer, + Ok(_) => break, + Err(err) if err.errno == EINTR => continue, + Err(err) => { + panic!("bootstrap: failed to write scheme response to kernel: {err}") + } } } } @@ -569,6 +573,7 @@ impl<'a> ProcScheme<'a> { } } fn on_dup(&mut self, old_id: usize, buf: &[u8]) -> Result { + log::trace!("Dup request"); match self.handles[old_id] { Handle::Proc(pid) => match buf { b"fork" => {