dkl logger: avoid a full thread just to forward signals

This commit is contained in:
Mikaël Cluseau
2026-04-14 10:06:39 +02:00
parent c19798f9f0
commit a5026b884d

View File

@@ -1,6 +1,6 @@
use async_compression::tokio::write::{ZstdDecoder, ZstdEncoder};
use chrono::{DurationRound, TimeDelta, Utc};
use eyre::{Result, format_err};
use eyre::{format_err, Result};
use log::{debug, error, warn};
use std::path::{Path, PathBuf};
use std::process::Stdio;
@@ -9,7 +9,8 @@ use tokio::{
io::{self, AsyncBufReadExt, AsyncRead, AsyncWrite, AsyncWriteExt, BufReader, BufWriter},
process,
sync::mpsc,
time::{Duration, sleep},
task::spawn_blocking,
time::{sleep, Duration},
};
use crate::{cgroup, fs};
@@ -92,7 +93,7 @@ impl<'t> Logger<'t> {
// forward signals
if let Some(child_pid) = child.id() {
std::thread::spawn(move || forward_signals_to(child_pid as i32));
spawn_blocking(move || forward_signals_to(child_pid as i32)).await?;
}
// handle output
@@ -200,24 +201,29 @@ impl<'t> Logger<'t> {
fn forward_signals_to(pid: i32) {
use nix::{
sys::signal::{Signal, kill},
sys::signal::{kill, Signal},
unistd::Pid,
};
use signal_hook::{consts::*, iterator::Signals};
use signal_hook::{consts::*, low_level::register};
log::debug!("forwarding signals to pid {pid}");
let mut signals = Signals::new([
SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGPIPE, SIGALRM,
])
.expect("signal setup failed");
let pid = Pid::from_raw(pid);
for signal in &mut signals {
let Ok(signal) = Signal::try_from(signal) else {
let signals = [
SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGPIPE, SIGALRM,
];
for sig in signals {
let Ok(signal) = Signal::try_from(sig) else {
continue;
};
let _ = kill(pid, signal);
unsafe {
register(sig, move || {
log::debug!("forwarding {signal} to {pid}");
let _ = kill(pid, signal);
})
.ok();
}
}
}