diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2020-09-19 18:03:10 +0200 | 
|---|---|---|
| committer | Mara Bos <m-ou.se@m-ou.se> | 2020-09-27 11:56:43 +0200 | 
| commit | 2cf0f64722a92dffa12d43a4c0383a9d76becbcc (patch) | |
| tree | 451f908baef6eef53f4538eba2e37ed983c76efd /library/std/src/sys/unix/futex.rs | |
| parent | 568d9696e90d6bd8125d59cebf13b3af624abd31 (diff) | |
| download | rust-2cf0f64722a92dffa12d43a4c0383a9d76becbcc.tar.gz rust-2cf0f64722a92dffa12d43a4c0383a9d76becbcc.zip | |
Move linux-specific futex code into `sys` module.
Diffstat (limited to 'library/std/src/sys/unix/futex.rs')
| -rw-r--r-- | library/std/src/sys/unix/futex.rs | 38 | 
1 files changed, 38 insertions, 0 deletions
| diff --git a/library/std/src/sys/unix/futex.rs b/library/std/src/sys/unix/futex.rs new file mode 100644 index 00000000000..6af06aa5f7e --- /dev/null +++ b/library/std/src/sys/unix/futex.rs @@ -0,0 +1,38 @@ +#![cfg(any(target_os = "linux", target_os = "android"))] + +use crate::sync::atomic::AtomicI32; +use crate::time::Duration; + +pub fn futex_wait(futex: &AtomicI32, expected: i32, timeout: Option<Duration>) { + let timespec; + let timespec_ptr = match timeout { + Some(timeout) => { + timespec = libc::timespec { + tv_sec: timeout.as_secs() as _, + tv_nsec: timeout.subsec_nanos() as _, + }; + ×pec as *const libc::timespec + } + None => crate::ptr::null(), + }; + unsafe { + libc::syscall( + libc::SYS_futex, + futex as *const AtomicI32, + libc::FUTEX_WAIT | libc::FUTEX_PRIVATE_FLAG, + expected, + timespec_ptr, + ); + } +} + +pub fn futex_wake(futex: &AtomicI32) { + unsafe { + libc::syscall( + libc::SYS_futex, + futex as *const AtomicI32, + libc::FUTEX_WAKE | libc::FUTEX_PRIVATE_FLAG, + 1, + ); + } +} | 
