use std::sync::atomic::{AtomicBool, Ordering};
use std::time::{Duration, Instant};
static TRIGGER: AtomicBool = AtomicBool::new(false);
fn should_stop() -> bool {
if TRIGGER.load(Ordering::Relaxed) {
return true;
}
TRIGGER.store(true, Ordering::Relaxed);
false
}
pub fn controlled_loop() -> usize {
let start = Instant::now();
for i in 1.. {
println!("{}", i);
if should_stop() {
return i;
}
std::thread::sleep(std::time::Duration::from_millis(100));
if start.elapsed() > Duration::from_secs(60) {
panic!("timed out");
}
}
unreachable!();
}
mod test {
#[test]
fn controlled_loop_terminates() {
assert_eq!(super::controlled_loop(), 2);
}
}