wip: waiter
This commit is contained in:
@@ -1,17 +1,8 @@
|
||||
|
||||
use std::error;
|
||||
use wingmate_rs::init;
|
||||
use tokio::task::{self, JoinHandle};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn error::Error>> {
|
||||
let sig_handler_fn: JoinHandle<Result<(), Box<dyn error::Error + Send + Sync>>> = task::spawn(async {
|
||||
init::sighandler::sighandler().await
|
||||
});
|
||||
|
||||
if let Err(v) = sig_handler_fn.await? {
|
||||
return Err(v as Box<dyn error::Error>)
|
||||
}
|
||||
|
||||
Ok(())
|
||||
init::daemon::start().await
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
pub mod sighandler;
|
||||
pub mod daemon;
|
||||
20
src/init/daemon.rs
Normal file
20
src/init/daemon.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
mod sighandler;
|
||||
mod waiter;
|
||||
|
||||
use std::error;
|
||||
use tokio::task::{self, JoinHandle};
|
||||
use tokio::sync::watch;
|
||||
|
||||
pub async fn start() -> Result<(), Box<dyn error::Error>> {
|
||||
let (tx, mut _rx) = watch::channel::<i32>(1);
|
||||
|
||||
let sig_handler_fn: JoinHandle<Result<(), Box<dyn error::Error + Send + Sync>>> = task::spawn(async move {
|
||||
sighandler::sighandler(tx).await
|
||||
});
|
||||
|
||||
if let Err(v) = sig_handler_fn.await? {
|
||||
return Err(v as Box<dyn error::Error>)
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
31
src/init/daemon/sighandler.rs
Normal file
31
src/init/daemon/sighandler.rs
Normal file
@@ -0,0 +1,31 @@
|
||||
use std::error;
|
||||
use tokio::signal::unix::{signal, SignalKind};
|
||||
use tokio::select;
|
||||
use tokio::sync::watch::Sender;
|
||||
|
||||
pub async fn sighandler(s: Sender<i32>) -> 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())?;
|
||||
|
||||
'signal: loop {
|
||||
select! {
|
||||
_ = sigint.recv() => {
|
||||
println!("got SIGINT");
|
||||
drop(s);
|
||||
break 'signal;
|
||||
},
|
||||
_ = sigterm.recv() => {
|
||||
println!("got SIGTERM");
|
||||
drop(s);
|
||||
break 'signal;
|
||||
},
|
||||
_ = sigchld.recv() => {
|
||||
// do nothing intentionally
|
||||
// return Err(())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
10
src/init/daemon/waiter.rs
Normal file
10
src/init/daemon/waiter.rs
Normal file
@@ -0,0 +1,10 @@
|
||||
use nix::sys::wait;
|
||||
use nix::unistd::Pid;
|
||||
|
||||
#[allow(dead_code)]
|
||||
fn wait_all() {
|
||||
match wait::waitpid(Pid::from_raw(-1), Some(wait::WaitPidFlag::WNOHANG)) {
|
||||
Ok(_x) => {},
|
||||
Err(_err) => {},
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
use std::error;
|
||||
use tokio::signal::unix::{signal, SignalKind};
|
||||
use tokio::select;
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub async fn sighandler() -> 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())?;
|
||||
select! {
|
||||
_ = sigint.recv() => {
|
||||
println!("got SIGINT");
|
||||
},
|
||||
_ = sigterm.recv() => {
|
||||
println!("got SIGTERM");
|
||||
},
|
||||
_ = sigchld.recv() => {
|
||||
// return Err(())
|
||||
},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user