1#![doc = include_str!("../README.md")]
2#![doc = "\n## Example\n\n```rust"]
3#![doc = include_str!("../examples/main.rs")]
4#![doc = "```"]
5
6use std::{process::exit, sync::Arc};
7
8use log::info;
9use parking_lot::{RwLock, RwLockReadGuard};
10
11#[derive(Default, Clone)]
12pub struct Exit(Arc<RwLock<()>>);
13
14impl Exit {
15 pub fn new() -> Self {
16 let arc = Arc::new(RwLock::new(()));
17
18 let copy = arc.clone();
19
20 ctrlc::set_handler(move || {
21 if copy.is_locked() {
22 info!("Waiting to exit safely...");
23 }
24 let _lock = copy.write();
25 info!("Exiting...");
26 exit(0);
27 })
28 .expect("Error setting Ctrl-C handler");
29
30 Self(arc)
31 }
32
33 pub fn lock(&self) -> RwLockReadGuard<'_, ()> {
34 self.0.read()
35 }
36}