interrupts 0.1.5

Cross-architecture utilities for temporarily disabling interrupts and signals.
Documentation
use nix::sys::signal::{SigSet, SigmaskHow};

pub type Flags = SigSet;

#[inline]
pub fn read_disable() -> Flags {
    SigSet::all()
        .thread_swap_mask(SigmaskHow::SIG_SETMASK)
        .unwrap()
}

#[inline]
pub fn restore(flags: Flags) {
    flags.thread_set_mask().unwrap();
}

#[cfg(test)]
mod tests {
    #[test]
    fn signals() {
        use core::sync::atomic::{AtomicBool, Ordering};

        use nix::libc;
        use nix::sys::signal::{self, SigHandler, Signal};

        static HANDLER_RAN: AtomicBool = AtomicBool::new(false);

        extern "C" fn handle_sigint(_signal: libc::c_int) {
            HANDLER_RAN.store(true, Ordering::Relaxed);
        }

        let handler = SigHandler::Handler(handle_sigint);
        unsafe { signal::signal(Signal::SIGINT, handler) }.unwrap();

        let guard = crate::disable();
        signal::raise(Signal::SIGINT).unwrap();
        assert!(!HANDLER_RAN.load(Ordering::Relaxed));
        drop(guard);
        assert!(HANDLER_RAN.load(Ordering::Relaxed));
    }
}