From 485e667fec27aebc8be8dacfc35c702f276d4c47 Mon Sep 17 00:00:00 2001 From: sodiboo Date: Fri, 18 Jul 2025 20:14:05 +0200 Subject: block signals early: now handled correctly with tracy ondemand --- src/utils/signals.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'src/utils/signals.rs') diff --git a/src/utils/signals.rs b/src/utils/signals.rs index 9aae44b1..bdface0f 100644 --- a/src/utils/signals.rs +++ b/src/utils/signals.rs @@ -34,6 +34,12 @@ pub fn listen(handle: &calloop::LoopHandle) { .unwrap(); } +// We block the signals early, so that they apply to all threads. +// They are then blocked *again* by the `Signals` source. That's fine. +pub fn block_early() -> io::Result<()> { + set_sigmask(&preferred_sigset()?) +} + pub fn unblock_all() -> io::Result<()> { set_sigmask(&empty_sigset()?) } @@ -47,6 +53,25 @@ pub fn empty_sigset() -> io::Result { } } +pub fn preferred_sigset() -> io::Result { + let mut set = empty_sigset()?; + unsafe { + add_signal(&mut set, libc::SIGINT)?; + add_signal(&mut set, libc::SIGTERM)?; + add_signal(&mut set, libc::SIGHUP)?; + } + Ok(set) +} + +// SAFETY: `signum` must be a valid signal number. +unsafe fn add_signal(set: &mut libc::sigset_t, signum: libc::c_int) -> io::Result<()> { + if unsafe { libc::sigaddset(set, signum) } == 0 { + Ok(()) + } else { + Err(io::Error::last_os_error()) + } +} + pub fn set_sigmask(set: &libc::sigset_t) -> io::Result<()> { let oldset = std::ptr::null_mut(); // ignore old mask if unsafe { libc::pthread_sigmask(libc::SIG_SETMASK, set, oldset) } == 0 { -- cgit