From 4fbd71c94324965f5a3bcf01845b6da0d51076b7 Mon Sep 17 00:00:00 2001 From: Mara Bos Date: Thu, 17 Mar 2022 12:27:20 +0100 Subject: [PATCH] Return timeout status in futex_wait. --- library/std/src/sys/unix/futex.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/library/std/src/sys/unix/futex.rs b/library/std/src/sys/unix/futex.rs index 42ddc1d514ec..22ba1a57fef2 100644 --- a/library/std/src/sys/unix/futex.rs +++ b/library/std/src/sys/unix/futex.rs @@ -12,7 +12,7 @@ use crate::sync::atomic::AtomicI32; use crate::time::Duration; #[cfg(any(target_os = "linux", target_os = "android"))] -pub fn futex_wait(futex: &AtomicI32, expected: i32, timeout: Option) { +pub fn futex_wait(futex: &AtomicI32, expected: i32, timeout: Option) -> bool { let timespec = timeout.and_then(|d| { Some(libc::timespec { // Sleep forever if the timeout is longer than fits in a timespec. @@ -21,15 +21,16 @@ pub fn futex_wait(futex: &AtomicI32, expected: i32, timeout: Option) { tv_nsec: d.subsec_nanos() as _, }) }); - unsafe { + let r = unsafe { libc::syscall( libc::SYS_futex, futex as *const AtomicI32, libc::FUTEX_WAIT | libc::FUTEX_PRIVATE_FLAG, expected, timespec.as_ref().map_or(null(), |d| d as *const libc::timespec), - ); - } + ) + }; + !(r < 0 && super::os::errno() == libc::ETIMEDOUT) } #[cfg(target_os = "emscripten")]