global: snapshot

This commit is contained in:
nym21
2025-02-27 12:32:54 +01:00
parent 677aca7a03
commit 877f9299e1
53 changed files with 259 additions and 203 deletions

View File

@@ -0,0 +1,62 @@
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)
}
}