From 64230332ccef4e5b25829fac965156bee4ac5ce7 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Fri, 27 Aug 2021 20:53:01 +0300 Subject: [PATCH] Refactor thread spawning into a separate module --- src/lib.rs | 1 + src/signals.rs | 8 +++++--- src/thread.rs | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/thread.rs 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") +}