wip: waiter

This commit is contained in:
2023-11-21 13:19:04 +11:00
parent 97ab962ae2
commit 14066e19b6
8 changed files with 83 additions and 35 deletions

View File

@@ -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
}

View File

@@ -1 +1 @@
pub mod sighandler;
pub mod daemon;

20
src/init/daemon.rs Normal file
View 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(())
}

View 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
View 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) => {},
}
}

View File

@@ -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(())
}