From 49b331855ece1c5fd6fdb4aa1cf91eebbd92244e Mon Sep 17 00:00:00 2001 From: Alice Ryhl Date: Mon, 13 Oct 2025 16:45:51 +0200 Subject: [PATCH] process: fix error when runtime is shut down on nightly-2025-10-12 (#7672) (cherry picked from commit 9e5527d1d5eadbeed46f4d5d4eb22cd96c72a39a) --- tokio/src/process/unix/pidfd_reaper.rs | 33 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/tokio/src/process/unix/pidfd_reaper.rs b/tokio/src/process/unix/pidfd_reaper.rs index 2574f360f..f29e99b1d 100644 --- a/tokio/src/process/unix/pidfd_reaper.rs +++ b/tokio/src/process/unix/pidfd_reaper.rs @@ -95,14 +95,41 @@ where pidfd: PollEvented, } +fn display_eq(d: impl std::fmt::Display, s: &str) -> bool { + use std::fmt::Write; + + struct FormatEq<'r> { + remainder: &'r str, + unequal: bool, + } + + impl<'r> Write for FormatEq<'r> { + fn write_str(&mut self, s: &str) -> std::fmt::Result { + if !self.unequal { + if let Some(new_remainder) = self.remainder.strip_prefix(s) { + self.remainder = new_remainder; + } else { + self.unequal = true; + } + } + Ok(()) + } + } + + let mut fmt_eq = FormatEq { + remainder: s, + unequal: false, + }; + let _ = write!(fmt_eq, "{d}"); + fmt_eq.remainder.is_empty() && !fmt_eq.unequal +} + #[allow(deprecated)] fn is_rt_shutdown_err(err: &io::Error) -> bool { if let Some(inner) = err.get_ref() { - // Using `Error::description()` is more efficient than `format!("{inner}")`, - // so we use it here even if it is deprecated. err.kind() == io::ErrorKind::Other && inner.source().is_none() - && inner.description() == RUNTIME_SHUTTING_DOWN_ERROR + && display_eq(inner, RUNTIME_SHUTTING_DOWN_ERROR) } else { false }