diff --git a/libc-test/build.rs b/libc-test/build.rs index 27497fa718957..226757c6ad8dc 100644 --- a/libc-test/build.rs +++ b/libc-test/build.rs @@ -434,6 +434,7 @@ fn test_openbsd(target: &str) { "signal.h", "string.h", "sys/file.h", + "sys/futex.h", "sys/ioctl.h", "sys/ipc.h", "sys/mman.h", @@ -505,6 +506,9 @@ fn test_openbsd(target: &str) { // https://marc.info/?l=openbsd-cvs&m=154723400730318 "mincore" => true, + // futex() has volatile arguments, but that doesn't exist in Rust. + "futex" => true, + _ => false, } }); diff --git a/libc-test/semver/openbsd.txt b/libc-test/semver/openbsd.txt index 479cef344dd3b..58b3eedd12ee8 100644 --- a/libc-test/semver/openbsd.txt +++ b/libc-test/semver/openbsd.txt @@ -215,6 +215,10 @@ FIONREAD FIOSETOWN FLUSHO FOPEN_MAX +FUTEX_WAIT +FUTEX_WAKE +FUTEX_REQUEUE +FUTEX_PRIVATE_FLAG F_GETOWN F_LOCK F_RDLCK @@ -987,6 +991,7 @@ fsid_t fstatfs ftok fusefs_args +futex futimes getdomainname getdtablesize diff --git a/src/unix/bsd/netbsdlike/openbsd/mod.rs b/src/unix/bsd/netbsdlike/openbsd/mod.rs index 2d0ac634438a0..1f0b1a1ec0e65 100644 --- a/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/src/unix/bsd/netbsdlike/openbsd/mod.rs @@ -1519,6 +1519,12 @@ pub const WCONTINUED: ::c_int = 8; pub const FIND: ::ACTION = 0; pub const ENTER: ::ACTION = 1; +// futex.h +pub const FUTEX_WAIT: ::c_int = 1; +pub const FUTEX_WAKE: ::c_int = 2; +pub const FUTEX_REQUEUE: ::c_int = 3; +pub const FUTEX_PRIVATE_FLAG: ::c_int = 128; + const_fn! { {const} fn _ALIGN(p: usize) -> usize { (p + _ALIGNBYTES) & !_ALIGNBYTES @@ -1703,6 +1709,15 @@ extern "C" { pub fn hcreate(nelt: ::size_t) -> ::c_int; pub fn hdestroy(); pub fn hsearch(entry: ::ENTRY, action: ::ACTION) -> *mut ::ENTRY; + + // futex.h + pub fn futex( + uaddr: *mut u32, + op: ::c_int, + val: ::c_int, + timeout: *const ::timespec, + uaddr2: *mut u32, + ) -> ::c_int; } #[link(name = "execinfo")]