diff --git a/tests/run-pass/concurrency/parking.rs b/tests/run-pass/concurrency/parking.rs new file mode 100644 index 000000000000..1ed742931fe6 --- /dev/null +++ b/tests/run-pass/concurrency/parking.rs @@ -0,0 +1,37 @@ +// ignore-windows: Concurrency on Windows is not supported yet. +// compile-flags: -Zmiri-disable-isolation + +use std::thread; +use std::time::{Duration, Instant}; + +// Normally, waiting in park/park_timeout may spuriously wake up early, but we +// know Miri's timed synchronization primitives do not do that. + +fn park_timeout() { + let start = Instant::now(); + + thread::park_timeout(Duration::from_millis(200)); + + assert!((200..500).contains(&start.elapsed().as_millis())); +} + +fn park_unpark() { + let t1 = thread::current(); + let t2 = thread::spawn(move || { + thread::park(); + thread::sleep(Duration::from_millis(200)); + t1.unpark(); + }); + + let start = Instant::now(); + + t2.thread().unpark(); + thread::park(); + + assert!((200..500).contains(&start.elapsed().as_millis())); +} + +fn main() { + park_timeout(); + park_unpark(); +} diff --git a/tests/run-pass/concurrency/parking.stderr b/tests/run-pass/concurrency/parking.stderr new file mode 100644 index 000000000000..2dbfb7721d36 --- /dev/null +++ b/tests/run-pass/concurrency/parking.stderr @@ -0,0 +1,2 @@ +warning: thread support is experimental. For example, Miri does not detect data races yet. +