wip: waiter
This commit is contained in:
parent
97ab962ae2
commit
14066e19b6
|
@ -44,6 +44,12 @@ version = "1.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitflags"
|
||||||
|
version = "2.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bytes"
|
name = "bytes"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
|
@ -119,6 +125,17 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.27.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.4.1",
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num_cpus"
|
name = "num_cpus"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
|
@ -191,7 +208,7 @@ version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
|
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags 1.3.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -354,5 +371,6 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||||
name = "wingmate-rs"
|
name = "wingmate-rs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"nix",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
|
@ -6,4 +6,5 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
nix = {version = "0.27.1", features = ["process"]}
|
||||||
tokio = { version = "1.34.0", features = ["full"] }
|
tokio = { version = "1.34.0", features = ["full"] }
|
||||||
|
|
|
@ -1,17 +1,8 @@
|
||||||
|
|
||||||
use std::error;
|
use std::error;
|
||||||
use wingmate_rs::init;
|
use wingmate_rs::init;
|
||||||
use tokio::task::{self, JoinHandle};
|
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn error::Error>> {
|
async fn main() -> Result<(), Box<dyn error::Error>> {
|
||||||
let sig_handler_fn: JoinHandle<Result<(), Box<dyn error::Error + Send + Sync>>> = task::spawn(async {
|
init::daemon::start().await
|
||||||
init::sighandler::sighandler().await
|
|
||||||
});
|
|
||||||
|
|
||||||
if let Err(v) = sig_handler_fn.await? {
|
|
||||||
return Err(v as Box<dyn error::Error>)
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
|
@ -1 +1 @@
|
||||||
pub mod sighandler;
|
pub mod daemon;
|
|
@ -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(())
|
||||||
|
}
|
|
@ -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(())
|
||||||
|
}
|
|
@ -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(())
|
|
||||||
}
|
|
Loading…
Reference in New Issue