From 14066e19b602c166d8e6ca7192b9354e86483f38 Mon Sep 17 00:00:00 2001 From: Suyono Date: Tue, 21 Nov 2023 13:19:04 +1100 Subject: [PATCH] wip: waiter --- Cargo.lock | 20 +++++++++++++++++++- Cargo.toml | 1 + src/bin/init.rs | 11 +---------- src/init.rs | 2 +- src/init/daemon.rs | 20 ++++++++++++++++++++ src/init/daemon/sighandler.rs | 31 +++++++++++++++++++++++++++++++ src/init/daemon/waiter.rs | 10 ++++++++++ src/init/sighandler.rs | 23 ----------------------- 8 files changed, 83 insertions(+), 35 deletions(-) create mode 100644 src/init/daemon.rs create mode 100644 src/init/daemon/sighandler.rs create mode 100644 src/init/daemon/waiter.rs delete mode 100644 src/init/sighandler.rs diff --git a/Cargo.lock b/Cargo.lock index 30c42b2..8009b84 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,6 +44,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "bytes" version = "1.5.0" @@ -119,6 +125,17 @@ dependencies = [ "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]] name = "num_cpus" version = "1.16.0" @@ -191,7 +208,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -354,5 +371,6 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" name = "wingmate-rs" version = "0.1.0" dependencies = [ + "nix", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index b7bc4b1..60c7fab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +nix = {version = "0.27.1", features = ["process"]} tokio = { version = "1.34.0", features = ["full"] } diff --git a/src/bin/init.rs b/src/bin/init.rs index 42ebf59..8500fa4 100644 --- a/src/bin/init.rs +++ b/src/bin/init.rs @@ -1,17 +1,8 @@ use std::error; use wingmate_rs::init; -use tokio::task::{self, JoinHandle}; #[tokio::main] async fn main() -> Result<(), Box> { - let sig_handler_fn: JoinHandle>> = task::spawn(async { - init::sighandler::sighandler().await - }); - - if let Err(v) = sig_handler_fn.await? { - return Err(v as Box) - } - - Ok(()) + init::daemon::start().await } \ No newline at end of file diff --git a/src/init.rs b/src/init.rs index ddfd3e5..7b1b652 100644 --- a/src/init.rs +++ b/src/init.rs @@ -1 +1 @@ -pub mod sighandler; \ No newline at end of file +pub mod daemon; \ No newline at end of file diff --git a/src/init/daemon.rs b/src/init/daemon.rs new file mode 100644 index 0000000..a8f944b --- /dev/null +++ b/src/init/daemon.rs @@ -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> { + let (tx, mut _rx) = watch::channel::(1); + + let sig_handler_fn: JoinHandle>> = task::spawn(async move { + sighandler::sighandler(tx).await + }); + + if let Err(v) = sig_handler_fn.await? { + return Err(v as Box) + } + + Ok(()) +} \ No newline at end of file diff --git a/src/init/daemon/sighandler.rs b/src/init/daemon/sighandler.rs new file mode 100644 index 0000000..89e9708 --- /dev/null +++ b/src/init/daemon/sighandler.rs @@ -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) -> Result<(), Box> { + 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(()) +} \ No newline at end of file diff --git a/src/init/daemon/waiter.rs b/src/init/daemon/waiter.rs new file mode 100644 index 0000000..bf4a29e --- /dev/null +++ b/src/init/daemon/waiter.rs @@ -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) => {}, + } +} \ No newline at end of file diff --git a/src/init/sighandler.rs b/src/init/sighandler.rs deleted file mode 100644 index f3e09fd..0000000 --- a/src/init/sighandler.rs +++ /dev/null @@ -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> { - 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(()) -} \ No newline at end of file