diff --git a/redox-rt/src/sys.rs b/redox-rt/src/sys.rs index e9ec7383a8b4034d1acd90e982678d6c2f0829e7..8cc3a0dbc15cd4cf931509e6a8aed6a71599e3bc 100644 --- a/redox-rt/src/sys.rs +++ b/redox-rt/src/sys.rs @@ -3,11 +3,10 @@ use syscall::error::{Result, Error, EINTR}; use crate::arch::manually_enter_trampoline; use crate::signal::tmp_disable_signals; -// TODO: uninitialized memory? #[inline] -pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> { +fn wrapper(mut f: impl FnMut() -> Result<usize>) -> Result<usize> { loop { - let res = syscall::read(fd, buf); + let res = f(); if res == Err(Error::new(EINTR)) { unsafe { @@ -18,18 +17,27 @@ pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> { return res; } } + +// TODO: uninitialized memory? +#[inline] +pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> { + wrapper(|| syscall::read(fd, buf)) +} #[inline] pub fn posix_write(fd: usize, buf: &[u8]) -> Result<usize> { - loop { - let res = syscall::write(fd, buf); - - if res == Err(Error::new(EINTR)) { - unsafe { - manually_enter_trampoline(); - } - } - - return res; - + wrapper(|| syscall::write(fd, buf)) +} +#[inline] +pub fn posix_kill(pid: usize, sig: usize) -> Result<()> { + match wrapper(|| syscall::kill(pid, sig)) { + Ok(_) | Err(Error { errno: EINTR }) => Ok(()), + Err(error) => Err(error), + } +} +#[inline] +pub fn posix_killpg(pgrp: usize, sig: usize) -> Result<()> { + match wrapper(|| syscall::kill(usize::wrapping_neg(pgrp), sig)) { + Ok(_) | Err(Error { errno: EINTR }) => Ok(()), + Err(error) => Err(error), } } diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs index dc5e816ff2fa5f349ce55b40688f5139d6825315..ce156d1dea25cb6556b0a201297ce17d3c5ded88 100644 --- a/src/platform/redox/signal.rs +++ b/src/platform/redox/signal.rs @@ -53,11 +53,11 @@ impl PalSignal for Sys { } fn kill(pid: pid_t, sig: c_int) -> c_int { - e(syscall::kill(pid as usize, sig as usize)) as c_int + e(redox_rt::sys::posix_kill(pid as usize, sig as usize).map(|()| 0)) as c_int } fn killpg(pgrp: pid_t, sig: c_int) -> c_int { - e(syscall::kill(-(pgrp as isize) as usize, sig as usize)) as c_int + e(redox_rt::sys::posix_killpg(pgrp as usize, sig as usize).map(|()| 0)) as c_int } fn raise(sig: c_int) -> c_int {