Enable syscall restart in futex_wait.

This commit is contained in:
4lDO2
2024-07-16 11:55:06 +02:00
parent bcce7e18db
commit 4c20a9abb2
14 changed files with 292 additions and 151 deletions
+4 -3
View File
@@ -242,8 +242,9 @@ impl Pal for Sys {
unsafe fn futex_wait(
addr: *mut u32,
val: u32,
deadline: *const timespec,
deadline: Option<&timespec>,
) -> Result<(), crate::pthread::Errno> {
let deadline = deadline.map_or(0, |d| d as *const _ as usize);
e_raw(unsafe {
syscall!(
FUTEX, addr, // uaddr
@@ -257,11 +258,11 @@ impl Pal for Sys {
.map(|_| ())
}
#[inline]
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<c_int, Errno> {
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, Errno> {
e_raw(unsafe {
syscall!(FUTEX, addr, 1 /* FUTEX_WAKE */, num)
})
.map(|n| n as c_int)
.map(|n| n as u32)
}
fn futimens(fd: c_int, times: *const timespec) -> c_int {
+2 -2
View File
@@ -82,9 +82,9 @@ pub trait Pal {
unsafe fn futex_wait(
addr: *mut u32,
val: u32,
deadline: *const timespec,
deadline: Option<&timespec>,
) -> Result<(), pthread::Errno>;
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<c_int, pthread::Errno>;
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, pthread::Errno>;
fn futimens(fd: c_int, times: *const timespec) -> c_int;
+12 -25
View File
@@ -1,4 +1,4 @@
use core::{convert::TryFrom, mem, ptr, result::Result as CoreResult, slice, str};
use core::{convert::TryFrom, mem, ptr, slice, str};
use syscall::{
self,
data::{Map, Stat as redox_stat, StatVfs as redox_statvfs, TimeSpec as redox_timespec},
@@ -305,31 +305,18 @@ impl Pal for Sys {
unsafe fn futex_wait(
addr: *mut u32,
val: u32,
deadline: *const timespec,
) -> CoreResult<(), pthread::Errno> {
syscall::syscall5(
syscall::SYS_FUTEX,
addr as usize,
syscall::FUTEX_WAIT,
val as usize,
deadline as usize,
0,
)
.map_err(|s| pthread::Errno(s.errno))
.map(|_| ())
deadline: Option<&timespec>,
) -> Result<(), pthread::Errno> {
let deadline = deadline.map(|d| syscall::TimeSpec {
tv_sec: d.tv_sec,
tv_nsec: d.tv_nsec as i32,
});
redox_rt::sys::sys_futex_wait(addr, val, deadline.as_ref())?;
Ok(())
}
#[inline]
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<c_int, pthread::Errno> {
syscall::syscall5(
syscall::SYS_FUTEX,
addr as usize,
syscall::FUTEX_WAKE,
num as usize,
0,
0,
)
.map_err(|s| pthread::Errno(s.errno))
.map(|n| n as c_int)
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<u32, pthread::Errno> {
Ok(redox_rt::sys::sys_futex_wake(addr, num)?)
}
// FIXME: unsound
@@ -996,7 +983,7 @@ impl Pal for Sys {
Ok(())
}
fn inner(utsname: *mut utsname) -> CoreResult<(), i32> {
fn inner(utsname: *mut utsname) -> Result<(), i32> {
match gethostname(unsafe {
slice::from_raw_parts_mut(
(*utsname).nodename.as_mut_ptr() as *mut u8,