Handle kill and killpg EINTR.

This commit is contained in:
4lDO2
2024-07-03 22:15:13 +02:00
parent 78247c8525
commit b64b0ebe18
2 changed files with 32 additions and 24 deletions
+30 -22
View File
@@ -3,33 +3,41 @@ use syscall::error::{Result, Error, EINTR};
use crate::arch::manually_enter_trampoline;
use crate::signal::tmp_disable_signals;
#[inline]
fn wrapper(mut f: impl FnMut() -> Result<usize>) -> Result<usize> {
loop {
let res = f();
if res == Err(Error::new(EINTR)) {
unsafe {
manually_enter_trampoline();
}
}
return res;
}
}
// TODO: uninitialized memory?
#[inline]
pub fn posix_read(fd: usize, buf: &mut [u8]) -> Result<usize> {
loop {
let res = syscall::read(fd, buf);
if res == Err(Error::new(EINTR)) {
unsafe {
manually_enter_trampoline();
}
}
return res;
}
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),
}
}
+2 -2
View File
@@ -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 {