about summary refs log tree commit diff
path: root/library/std/src/sys/unix/futex.rs
diff options
context:
space:
mode:
authorMara Bos <m-ou.se@m-ou.se>2020-09-19 18:03:10 +0200
committerMara Bos <m-ou.se@m-ou.se>2020-09-27 11:56:43 +0200
commit2cf0f64722a92dffa12d43a4c0383a9d76becbcc (patch)
tree451f908baef6eef53f4538eba2e37ed983c76efd /library/std/src/sys/unix/futex.rs
parent568d9696e90d6bd8125d59cebf13b3af624abd31 (diff)
downloadrust-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.rs38
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 _,
+            };
+            &timespec 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,
+        );
+    }
+}