Skip to content

Commit a515d21

Browse files
split futex into individual functions
1 parent 011fb50 commit a515d21

File tree

5 files changed

+536
-28
lines changed

5 files changed

+536
-28
lines changed

src/backend/libc/thread/syscalls.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ use crate::thread::{NanosleepRelativeResult, Timespec};
88
#[cfg(all(target_env = "gnu", fix_y2038))]
99
use crate::timespec::LibcTimespec;
1010
use core::mem::MaybeUninit;
11+
use core::sync::atomic::AtomicU32;
1112
#[cfg(linux_kernel)]
1213
use {
14+
super::futex::FutexOperation,
1315
crate::backend::conv::{borrowed_fd, ret_c_int, ret_usize},
1416
crate::fd::BorrowedFd,
1517
crate::pid::Pid,
16-
crate::thread::{FutexFlags, FutexOperation},
18+
crate::thread::FutexFlags,
1719
crate::utils::as_mut_ptr,
1820
};
1921
#[cfg(not(any(
@@ -418,12 +420,12 @@ pub(crate) fn setresgid_thread(
418420
// TODO: This could be de-multiplexed.
419421
#[cfg(linux_kernel)]
420422
pub(crate) unsafe fn futex(
421-
uaddr: *mut u32,
423+
uaddr: *const AtomicU32,
422424
op: FutexOperation,
423425
flags: FutexFlags,
424426
val: u32,
425427
utime: *const Timespec,
426-
uaddr2: *mut u32,
428+
uaddr2: *const AtomicU32,
427429
val3: u32,
428430
) -> io::Result<usize> {
429431
#[cfg(all(
@@ -437,11 +439,11 @@ pub(crate) unsafe fn futex(
437439

438440
syscall! {
439441
fn futex_time64(
440-
uaddr: *mut u32,
442+
uaddr: *const AtomicU32,
441443
futex_op: c::c_int,
442444
val: u32,
443445
timeout: *const Timespec,
444-
uaddr2: *mut u32,
446+
uaddr2: *const AtomicU32,
445447
val3: u32
446448
) via SYS_futex_time64 -> c::ssize_t
447449
}
@@ -473,11 +475,11 @@ pub(crate) unsafe fn futex(
473475
{
474476
syscall! {
475477
fn futex(
476-
uaddr: *mut u32,
478+
uaddr: *const AtomicU32,
477479
futex_op: c::c_int,
478480
val: u32,
479481
timeout: *const linux_raw_sys::general::__kernel_timespec,
480-
uaddr2: *mut u32,
482+
uaddr2: *const AtomicU32,
481483
val3: u32
482484
) via SYS_futex -> c::c_long
483485
}
@@ -499,21 +501,21 @@ pub(crate) unsafe fn futex(
499501
not(any(target_arch = "aarch64", target_arch = "x86_64"))
500502
))]
501503
unsafe fn futex_old(
502-
uaddr: *mut u32,
504+
uaddr: *const AtomicU32,
503505
op: FutexOperation,
504506
flags: FutexFlags,
505507
val: u32,
506508
utime: *const Timespec,
507-
uaddr2: *mut u32,
509+
uaddr2: *const AtomicU32,
508510
val3: u32,
509511
) -> io::Result<usize> {
510512
syscall! {
511513
fn futex(
512-
uaddr: *mut u32,
514+
uaddr: *const AtomicU32,
513515
futex_op: c::c_int,
514516
val: u32,
515517
timeout: *const linux_raw_sys::general::__kernel_old_timespec,
516-
uaddr2: *mut u32,
518+
uaddr2: *const AtomicU32,
517519
val3: u32
518520
) via SYS_futex -> c::c_long
519521
}

src/backend/linux_raw/conv.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -790,11 +790,19 @@ impl<'a, Num: ArgNumber> From<(crate::net::SocketType, crate::net::SocketFlags)>
790790
}
791791

792792
#[cfg(feature = "thread")]
793-
impl<'a, Num: ArgNumber> From<(crate::thread::FutexOperation, crate::thread::FutexFlags)>
794-
for ArgReg<'a, Num>
793+
impl<'a, Num: ArgNumber>
794+
From<(
795+
crate::backend::thread::futex::FutexOperation,
796+
crate::thread::FutexFlags,
797+
)> for ArgReg<'a, Num>
795798
{
796799
#[inline]
797-
fn from(pair: (crate::thread::FutexOperation, crate::thread::FutexFlags)) -> Self {
800+
fn from(
801+
pair: (
802+
crate::backend::thread::futex::FutexOperation,
803+
crate::thread::FutexFlags,
804+
),
805+
) -> Self {
798806
c_uint(pair.0 as u32 | pair.1.bits())
799807
}
800808
}

src/backend/linux_raw/thread/syscalls.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
//! See the `rustix::backend` module documentation for details.
66
#![allow(unsafe_code, clippy::undocumented_unsafe_blocks)]
77

8+
use super::futex::FutexOperation;
89
use crate::backend::c;
910
use crate::backend::conv::{
1011
by_mut, by_ref, c_int, c_uint, ret, ret_c_int, ret_c_int_infallible, ret_usize, slice,
@@ -13,8 +14,9 @@ use crate::backend::conv::{
1314
use crate::fd::BorrowedFd;
1415
use crate::io;
1516
use crate::pid::Pid;
16-
use crate::thread::{ClockId, FutexFlags, FutexOperation, NanosleepRelativeResult, Timespec};
17+
use crate::thread::{ClockId, FutexFlags, NanosleepRelativeResult, Timespec};
1718
use core::mem::MaybeUninit;
19+
use core::sync::atomic::AtomicU32;
1820
#[cfg(target_pointer_width = "32")]
1921
use linux_raw_sys::general::timespec as __kernel_old_timespec;
2022
use linux_raw_sys::general::{__kernel_timespec, TIMER_ABSTIME};
@@ -206,12 +208,12 @@ pub(crate) fn gettid() -> Pid {
206208
// TODO: This could be de-multiplexed.
207209
#[inline]
208210
pub(crate) unsafe fn futex(
209-
uaddr: *mut u32,
211+
uaddr: *const AtomicU32,
210212
op: FutexOperation,
211213
flags: FutexFlags,
212214
val: u32,
213215
utime: *const Timespec,
214-
uaddr2: *mut u32,
216+
uaddr2: *const AtomicU32,
215217
val3: u32,
216218
) -> io::Result<usize> {
217219
#[cfg(target_pointer_width = "32")]
@@ -249,12 +251,12 @@ pub(crate) unsafe fn futex(
249251

250252
#[cfg(target_pointer_width = "32")]
251253
unsafe fn futex_old(
252-
uaddr: *mut u32,
254+
uaddr: *const AtomicU32,
253255
op: FutexOperation,
254256
flags: FutexFlags,
255257
val: u32,
256258
utime: *const Timespec,
257-
uaddr2: *mut u32,
259+
uaddr2: *const AtomicU32,
258260
val3: u32,
259261
) -> io::Result<usize> {
260262
let old_utime = __kernel_old_timespec {

0 commit comments

Comments
 (0)