#![cfg(not(windows))]
extern crate signal_hook;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::mpsc::{self, RecvTimeoutError};
use std::sync::Arc;
use std::thread;
use std::time::Duration;
use signal_hook::iterator::Signals;
use signal_hook::{SIGUSR1, SIGUSR2};
#[test]
fn signals_close_forever() {
let signals = Signals::new(&[SIGUSR1]).unwrap();
let stopped = Arc::new(AtomicBool::new(false));
let threads = (0..5).map(|_| {
let signals_bg = signals.clone();
let stopped_bg = Arc::clone(&stopped);
thread::spawn(move || {
for _sig in &signals_bg {}
stopped_bg.store(true, Ordering::SeqCst);
})
});
thread::sleep(Duration::from_millis(100));
assert!(!stopped.load(Ordering::SeqCst));
signals.close();
for thread in threads {
thread.join().unwrap();
}
}
#[test]
fn signals_block_wait() {
let signals = Signals::new(&[SIGUSR2]).unwrap();
let (s, r) = mpsc::channel();
thread::spawn(move || {
for _ in 0..10 {
for _ in signals.wait() {
panic!("Someone really did send us SIGUSR2, which breaks the test");
}
}
let _ = s.send(());
});
let err = r
.recv_timeout(Duration::from_millis(100))
.expect_err("Wait didn't wait properly");
assert_eq!(err, RecvTimeoutError::Timeout);
}