workflow_service/
signals.rs

1use crate::imports::*;
2
3pub trait Shutdown {
4    fn shutdown(&self);
5}
6
7pub struct Signals {
8    runtime: Runtime,
9    iterations: AtomicU64,
10}
11
12impl Signals {
13    pub fn bind(runtime: &Runtime) {
14        let signals = Arc::new(Signals {
15            runtime: runtime.clone(),
16            iterations: AtomicU64::new(0),
17        });
18
19        ctrlc::set_handler(move || {
20            let v = signals.iterations.fetch_add(1, Ordering::SeqCst);
21
22            match v {
23                0 => {
24                    println!("^SIGTERM - shutting down...");
25                    signals.runtime.terminate();
26                }
27                _ => {
28                    println!("^SIGTERM - halting");
29                    std::process::exit(1);
30                }
31            }
32        })
33        .expect("Error setting signal handler");
34    }
35}