use std::io::Error;
use std::sync::Arc;
use signal_hook::SigId;
use super::Handle;
impl Handle {
pub fn register_signal(&self, signal: libc::c_int) -> Result<SigId, Error> {
signal_hook::flag::register(signal, Arc::clone(&self.0))
}
}
#[cfg(all(test, not(windows)))] mod tests {
use std::io::Read;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
use std::time::Duration;
use super::*;
struct Fake(Arc<AtomicUsize>);
impl Read for Fake {
fn read(&mut self, _buf: &mut [u8]) -> Result<usize, Error> {
Ok(0) }
}
#[test]
fn signal_sent() {
let opened_times = Arc::new(AtomicUsize::new(0));
let opened_times_cp = Arc::clone(&opened_times);
let mut reopen = crate::Reopen::new(Box::new(move || {
opened_times_cp.fetch_add(1, Ordering::Relaxed);
Ok(Fake(Arc::clone(&opened_times_cp)))
}))
.unwrap();
assert_eq!(1, opened_times.load(Ordering::Relaxed));
let mut buf = [0];
assert_eq!(0, reopen.read(&mut buf).unwrap());
assert_eq!(1, opened_times.load(Ordering::Relaxed));
reopen.handle().register_signal(libc::SIGHUP).unwrap();
unsafe { libc::kill(libc::getpid(), libc::SIGHUP) };
thread::sleep(Duration::from_secs(1));
assert_eq!(0, reopen.read(&mut buf).unwrap());
assert_eq!(2, opened_times.load(Ordering::Relaxed));
}
}