diff --git a/src/lib.rs b/src/lib.rs index 4d8be19..95935f3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -23,6 +23,7 @@ mod p2p; pub mod server; mod signals; mod status; +mod thread; mod tracker; mod types; diff --git a/src/signals.rs b/src/signals.rs index 4bcc43c..810cce6 100644 --- a/src/signals.rs +++ b/src/signals.rs @@ -1,8 +1,9 @@ +use anyhow::Context; use crossbeam_channel::{unbounded, Receiver}; use signal_hook::consts::signal::*; use signal_hook::iterator::Signals; -use std::thread; +use crate::thread::spawn; pub(crate) enum Signal { Exit, @@ -16,15 +17,16 @@ pub(crate) fn register() -> Receiver { ]; let (tx, rx) = unbounded(); let mut signals = Signals::new(&ids).expect("failed to register signal hook"); - thread::spawn(move || { + spawn("signal", move || { for id in &mut signals { info!("notified via SIG{}", id); let signal = match id { SIGUSR1 => Signal::Trigger, _ => Signal::Exit, }; - tx.send(signal).expect("failed to send signal"); + tx.send(signal).context("failed to send signal")?; } + Ok(()) }); rx } diff --git a/src/thread.rs b/src/thread.rs new file mode 100644 index 0000000..caef419 --- /dev/null +++ b/src/thread.rs @@ -0,0 +1,15 @@ +use anyhow::Result; + +pub(crate) fn spawn(name: &'static str, f: F) -> std::thread::JoinHandle<()> +where + F: 'static + Send + FnOnce() -> Result<()>, +{ + std::thread::Builder::new() + .name(name.to_owned()) + .spawn(move || { + if let Err(e) = f() { + warn!("{} thread failed: {}", name, e); + } + }) + .expect("failed to spawn a thread") +}