mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-05-10 22:29:09 -07:00
65 lines
1.3 KiB
Rust
65 lines
1.3 KiB
Rust
#![doc = include_str!("../README.md")]
|
|
|
|
use std::{
|
|
process::exit,
|
|
sync::{
|
|
Arc,
|
|
atomic::{AtomicBool, Ordering},
|
|
},
|
|
thread::sleep,
|
|
time::Duration,
|
|
};
|
|
|
|
use log::info;
|
|
|
|
#[derive(Default, Clone)]
|
|
pub struct Exit {
|
|
blocking: Arc<AtomicBool>,
|
|
triggered: Arc<AtomicBool>,
|
|
}
|
|
|
|
impl Exit {
|
|
pub fn new() -> Self {
|
|
let s = Self {
|
|
triggered: Arc::new(AtomicBool::new(false)),
|
|
blocking: Arc::new(AtomicBool::new(false)),
|
|
};
|
|
|
|
let triggered = s.triggered.clone();
|
|
|
|
let blocking = s.blocking.clone();
|
|
let is_blocking = move || blocking.load(Ordering::SeqCst);
|
|
|
|
ctrlc::set_handler(move || {
|
|
info!("Exitting...");
|
|
|
|
triggered.store(true, Ordering::SeqCst);
|
|
|
|
if is_blocking() {
|
|
info!("Waiting to exit safely...");
|
|
|
|
while is_blocking() {
|
|
sleep(Duration::from_millis(50));
|
|
}
|
|
}
|
|
|
|
exit(0);
|
|
})
|
|
.expect("Error setting Ctrl-C handler");
|
|
|
|
s
|
|
}
|
|
|
|
pub fn block(&self) {
|
|
self.blocking.store(true, Ordering::SeqCst);
|
|
}
|
|
|
|
pub fn release(&self) {
|
|
self.blocking.store(false, Ordering::SeqCst);
|
|
}
|
|
|
|
pub fn triggered(&self) -> bool {
|
|
self.triggered.load(Ordering::SeqCst)
|
|
}
|
|
}
|