From 201eaf576a04b3c3073bcd20ee34f6139cefc13d Mon Sep 17 00:00:00 2001 From: pjht Date: Fri, 8 Nov 2024 13:37:24 -0600 Subject: [PATCH] mikros: Add process wait support --- library/std/src/sys/pal/mikros/process.rs | 69 ++++++++++++----------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/library/std/src/sys/pal/mikros/process.rs b/library/std/src/sys/pal/mikros/process.rs index 1934b08190b..eda26ad9415 100644 --- a/library/std/src/sys/pal/mikros/process.rs +++ b/library/std/src/sys/pal/mikros/process.rs @@ -144,7 +144,7 @@ pub fn spawn( res?; }; syscalls::wake_new(pid).unwrap(); - Ok((Process { dummy: () }, StdioPipes { stdin: None, stdout: None, stderr: None })) + Ok((Process { pid }, StdioPipes { stdin: None, stdout: None, stderr: None })) } pub fn output(&mut self) -> io::Result<(ExitStatus, Vec, Vec)> { @@ -242,15 +242,15 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { #[derive(PartialEq, Eq, Clone, Copy, Debug, Default)] #[non_exhaustive] -pub struct ExitStatus(); +pub struct ExitStatus(u8); impl ExitStatus { pub fn exit_ok(&self) -> Result<(), ExitStatusError> { - Ok(()) + if self.0 == 0 { Ok(()) } else { Err(ExitStatusError(self.0)) } } pub fn code(&self) -> Option { - Some(0) + Some(self.0 as i32) } } @@ -260,39 +260,18 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { } } -pub struct ExitStatusError(!); - -impl Clone for ExitStatusError { - fn clone(&self) -> ExitStatusError { - self.0 - } -} - -impl Copy for ExitStatusError {} - -impl PartialEq for ExitStatusError { - fn eq(&self, _other: &ExitStatusError) -> bool { - self.0 - } -} - -impl Eq for ExitStatusError {} - -impl fmt::Debug for ExitStatusError { - fn fmt(&self, _f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.0 - } -} +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct ExitStatusError(u8); impl Into for ExitStatusError { fn into(self) -> ExitStatus { - self.0 + ExitStatus(self.0) } } impl ExitStatusError { pub fn code(self) -> Option> { - self.0 + Some(NonZero::new(self.0 as i32).unwrap()) } } @@ -318,24 +297,46 @@ fn from(code: u8) -> Self { } pub struct Process { - dummy: (), + pid: u64, } impl Process { pub fn id(&self) -> u32 { - todo!() + self.pid.try_into().unwrap() } pub fn kill(&mut self) -> io::Result<()> { - todo!() + unsupported() } pub fn wait(&mut self) -> io::Result { - todo!() + let Some(proc_man_pid) = syscalls::try_get_registered(3) else { + return unsupported(); + }; + let wait_res: Result<(u64, u8), Errno> = postcard::from_bytes( + &rpc::send_call(proc_man_pid, 8, 5, &postcard::to_allocvec(&(self.pid, true)).unwrap()) + .get_return(), + ) + .unwrap(); + let (_wait_pid, code) = wait_res?; + Ok(ExitStatus(code)) } pub fn try_wait(&mut self) -> io::Result> { - todo!() + let Some(proc_man_pid) = syscalls::try_get_registered(3) else { + return unsupported(); + }; + let wait_res: Result<(u64, u8), Errno> = postcard::from_bytes( + &rpc::send_call(proc_man_pid, 8, 5, &postcard::to_allocvec(&(self.pid, true)).unwrap()) + .get_return(), + ) + .unwrap(); + let (_wait_pid, code) = match wait_res { + Ok(val) => val, + Err(Errno::EAGAIN) => return Ok(None), + Err(e) => return Err(e.into()), + }; + Ok(Some(ExitStatus(code))) } }