use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
pub struct SigintHandle {
flag: Arc<AtomicBool>,
}
impl SigintHandle {
pub fn received(&self) -> bool {
self.flag.load(Ordering::Acquire)
}
pub fn ack(&self) {
self.flag.store(false, Ordering::Release);
}
}
pub fn install_sigint_handler() -> std::io::Result<SigintHandle> {
let flag = Arc::new(AtomicBool::new(false));
let f = Arc::clone(&flag);
ctrlc::set_handler(move || {
f.store(true, Ordering::Release);
})
.map_err(std::io::Error::other)?;
Ok(SigintHandle { flag })
}