Add test for FUTEX_WAIT_BITSET.
This commit is contained in:
parent
37cefa32d2
commit
a72a929b19
@ -7,6 +7,7 @@
|
||||
#![feature(rustc_private)]
|
||||
extern crate libc;
|
||||
|
||||
use std::mem::MaybeUninit;
|
||||
use std::ptr;
|
||||
use std::thread;
|
||||
use std::time::{Duration, Instant};
|
||||
@ -93,6 +94,42 @@ fn wait_timeout() {
|
||||
assert!((200..1000).contains(&start.elapsed().as_millis()));
|
||||
}
|
||||
|
||||
fn wait_absolute_timeout() {
|
||||
let start = Instant::now();
|
||||
|
||||
// Get the current monotonic timestamp as timespec.
|
||||
let mut timeout = unsafe {
|
||||
let mut now: MaybeUninit<libc::timespec> = MaybeUninit::uninit();
|
||||
assert_eq!(libc::clock_gettime(libc::CLOCK_MONOTONIC, now.as_mut_ptr()), 0);
|
||||
now.assume_init()
|
||||
};
|
||||
|
||||
// Add 200ms.
|
||||
timeout.tv_nsec += 200_000_000;
|
||||
if timeout.tv_nsec > 1_000_000_000 {
|
||||
timeout.tv_nsec -= 1_000_000_000;
|
||||
timeout.tv_sec += 1;
|
||||
}
|
||||
|
||||
let futex: i32 = 123;
|
||||
|
||||
// Wait for 200ms from now, with nobody waking us up early.
|
||||
unsafe {
|
||||
assert_eq!(libc::syscall(
|
||||
libc::SYS_futex,
|
||||
&futex as *const i32,
|
||||
libc::FUTEX_WAIT_BITSET,
|
||||
123,
|
||||
&timeout,
|
||||
0,
|
||||
u32::MAX,
|
||||
), -1);
|
||||
assert_eq!(*libc::__errno_location(), libc::ETIMEDOUT);
|
||||
}
|
||||
|
||||
assert!((200..1000).contains(&start.elapsed().as_millis()));
|
||||
}
|
||||
|
||||
fn wait_wake() {
|
||||
let start = Instant::now();
|
||||
|
||||
@ -128,5 +165,6 @@ fn main() {
|
||||
wake_dangling();
|
||||
wait_wrong_val();
|
||||
wait_timeout();
|
||||
wait_absolute_timeout();
|
||||
wait_wake();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user