wip: initial test
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
use std::error;
|
||||
use tokio::signal::unix::{signal, SignalKind};
|
||||
use tokio::select;
|
||||
use tokio::sync::watch::Sender;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use tokio_util::sync::CancellationToken;
|
||||
|
||||
pub async fn sighandler(s: Sender<i32>) -> Result<(), Box<dyn error::Error + Send + Sync>> {
|
||||
pub async fn sighandler(flag: Arc<Mutex<bool>>, cancel: CancellationToken, exit: CancellationToken) -> Result<(), Box<dyn error::Error + Send + Sync>> {
|
||||
let mut sigint = signal(SignalKind::interrupt())?;
|
||||
let mut sigterm = signal(SignalKind::terminate())?;
|
||||
let mut sigchld = signal(SignalKind::child())?;
|
||||
@@ -12,20 +13,28 @@ pub async fn sighandler(s: Sender<i32>) -> Result<(), Box<dyn error::Error + Sen
|
||||
select! {
|
||||
_ = sigint.recv() => {
|
||||
println!("got SIGINT");
|
||||
drop(s);
|
||||
break 'signal;
|
||||
initiate_stop(flag.clone(), cancel.clone());
|
||||
},
|
||||
_ = sigterm.recv() => {
|
||||
println!("got SIGTERM");
|
||||
drop(s);
|
||||
break 'signal;
|
||||
initiate_stop(flag.clone(), cancel.clone());
|
||||
},
|
||||
_ = sigchld.recv() => {
|
||||
// do nothing intentionally
|
||||
// return Err(())
|
||||
},
|
||||
_ = exit.cancelled() => {
|
||||
break 'signal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn initiate_stop(flag: Arc<Mutex<bool>>, cancel: CancellationToken) {
|
||||
{
|
||||
let mut fl = flag.lock().unwrap();
|
||||
*fl = true;
|
||||
}
|
||||
cancel.cancel();
|
||||
}
|
||||
Reference in New Issue
Block a user