term_handler/
lib.rs

1#[macro_use] extern crate lazy_static;
2extern crate signal_simple;
3
4use signal_simple::signal::{signal as sig, SIGTERM, SIGINT, int};
5use signal_simple::channel::SyncChannel;
6
7lazy_static! {
8    static ref TERM_HANDLER_CHANNEL: SyncChannel<()> = SyncChannel::new();
9}
10
11fn term_handler(_: int) {
12    TERM_HANDLER_CHANNEL.send(()).unwrap();
13}
14
15pub fn wait_for_term() {
16    sig(SIGTERM, term_handler, None);
17    sig(SIGINT, term_handler, None);
18
19    loop {
20        if let Ok(Some(_)) = TERM_HANDLER_CHANNEL.try_recv() {
21            break;
22        }
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use signal_simple::signal::kill;
30
31    #[test]
32    fn test_term() {
33        ::std::thread::spawn(|| {
34            ::std::thread::sleep(::std::time::Duration::from_secs(2));
35            kill(SIGTERM);
36        });
37        wait_for_term();
38    }
39}