Various futex fixes
This commit is contained in:
committed by
Jeremy Soller
parent
7cf68bc8ee
commit
1fba2ef10a
@@ -235,15 +235,32 @@ impl Pal for Sys {
|
||||
e(unsafe { syscall!(FTRUNCATE, fildes, length) }) as c_int
|
||||
}
|
||||
|
||||
fn futex(
|
||||
addr: *mut c_int,
|
||||
op: c_int,
|
||||
val: c_int,
|
||||
val2: usize,
|
||||
) -> Result<c_long, crate::pthread::Errno> {
|
||||
e_raw(unsafe { syscall!(FUTEX, addr, op, val, val2, 0, 0) })
|
||||
.map(|r| r as c_long)
|
||||
.map_err(|e| crate::pthread::Errno(e as c_int))
|
||||
#[inline]
|
||||
unsafe fn futex_wait(
|
||||
addr: *mut u32,
|
||||
val: u32,
|
||||
deadline: *const timespec,
|
||||
) -> Result<(), crate::pthread::Errno> {
|
||||
e_raw(unsafe {
|
||||
syscall!(
|
||||
FUTEX, addr, // uaddr
|
||||
9, // futex_op: FUTEX_WAIT_BITSET
|
||||
val, // val
|
||||
deadline, // timeout: deadline
|
||||
0, // uaddr2/val2: 0/NULL
|
||||
0xffffffff // val3: FUTEX_BITSET_MATCH_ANY
|
||||
)
|
||||
})
|
||||
.map_err(|e| crate::pthread::Errno(e as c_int))
|
||||
.map(|_| ())
|
||||
}
|
||||
#[inline]
|
||||
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<c_int, crate::pthread::Errno> {
|
||||
e_raw(unsafe {
|
||||
syscall!(FUTEX, addr, 1 /* FUTEX_WAKE */, num)
|
||||
})
|
||||
.map_err(|e| crate::pthread::Errno(e as c_int))
|
||||
.map(|n| n as c_int)
|
||||
}
|
||||
|
||||
fn futimens(fd: c_int, times: *const timespec) -> c_int {
|
||||
|
||||
@@ -10,6 +10,7 @@ use crate::{
|
||||
sys_utsname::utsname,
|
||||
time::timespec,
|
||||
},
|
||||
pthread,
|
||||
};
|
||||
|
||||
pub use self::epoll::PalEpoll;
|
||||
@@ -78,12 +79,12 @@ pub trait Pal {
|
||||
|
||||
fn ftruncate(fildes: c_int, length: off_t) -> c_int;
|
||||
|
||||
fn futex(
|
||||
addr: *mut c_int,
|
||||
op: c_int,
|
||||
val: c_int,
|
||||
val2: usize,
|
||||
) -> Result<c_long, crate::pthread::Errno>;
|
||||
unsafe fn futex_wait(
|
||||
addr: *mut u32,
|
||||
val: u32,
|
||||
deadline: *const timespec,
|
||||
) -> Result<(), pthread::Errno>;
|
||||
unsafe fn futex_wake(addr: *mut u32, num: u32) -> Result<c_int, pthread::Errno>;
|
||||
|
||||
fn futimens(fd: c_int, times: *const timespec) -> c_int;
|
||||
|
||||
|
||||
+31
-20
@@ -24,6 +24,7 @@ use crate::{
|
||||
unistd::{F_OK, R_OK, W_OK, X_OK},
|
||||
},
|
||||
io::{self, prelude::*, BufReader},
|
||||
pthread,
|
||||
};
|
||||
|
||||
pub use redox_exec::FdGuard;
|
||||
@@ -300,25 +301,35 @@ impl Pal for Sys {
|
||||
e(syscall::ftruncate(fd as usize, len as usize)) as c_int
|
||||
}
|
||||
|
||||
// FIXME: unsound
|
||||
fn futex(
|
||||
addr: *mut c_int,
|
||||
op: c_int,
|
||||
val: c_int,
|
||||
val2: usize,
|
||||
) -> Result<c_long, crate::pthread::Errno> {
|
||||
match unsafe {
|
||||
syscall::futex(
|
||||
addr as *mut i32,
|
||||
op as usize,
|
||||
val as i32,
|
||||
val2,
|
||||
ptr::null_mut(),
|
||||
)
|
||||
} {
|
||||
Ok(success) => Ok(success as c_long),
|
||||
Err(err) => Err(crate::pthread::Errno(err.errno)),
|
||||
}
|
||||
#[inline]
|
||||
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(|_| ())
|
||||
}
|
||||
#[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)
|
||||
}
|
||||
|
||||
// FIXME: unsound
|
||||
@@ -1106,7 +1117,7 @@ impl Pal for Sys {
|
||||
|
||||
fn verify() -> bool {
|
||||
// GETPID on Redox is 20, which is WRITEV on Linux
|
||||
e(unsafe { syscall::syscall5(syscall::number::SYS_GETPID, !0, !0, !0, !0, !0) }) != !0
|
||||
(unsafe { syscall::syscall5(syscall::number::SYS_GETPID, !0, !0, !0, !0, !0) }).is_ok()
|
||||
}
|
||||
|
||||
fn exit_thread() -> ! {
|
||||
|
||||
Reference in New Issue
Block a user