Various futex fixes

This commit is contained in:
Jacob Lorentzon
2024-04-05 20:31:06 +00:00
committed by Jeremy Soller
parent 7cf68bc8ee
commit 1fba2ef10a
10 changed files with 216 additions and 68 deletions
+26 -9
View File
@@ -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 {