diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-console.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-console.exe index e86516885d6d7..e5449cee8e846 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-console.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-console.exe differ diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-gui.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-gui.exe index a0b8d890aaed2..25009cb3c13dc 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-gui.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-aarch64-gui.exe differ diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-console.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-console.exe index 682bbda460e38..ea1c867b20824 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-console.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-console.exe differ diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-gui.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-gui.exe index 3e25ee1d10932..0811c065c76c0 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-gui.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-i686-gui.exe differ diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-console.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-console.exe index 159c06dd166fa..5cdd48d5b1357 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-console.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-console.exe differ diff --git a/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-gui.exe b/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-gui.exe index d314b57246402..22b461aee3193 100755 Binary files a/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-gui.exe and b/crates/uv-trampoline-builder/trampolines/uv-trampoline-x86_64-gui.exe differ diff --git a/crates/uv-trampoline/src/bounce.rs b/crates/uv-trampoline/src/bounce.rs index 574d5e2a994ce..859b789b7fc86 100644 --- a/crates/uv-trampoline/src/bounce.rs +++ b/crates/uv-trampoline/src/bounce.rs @@ -452,11 +452,25 @@ pub fn bounce(is_gui: bool) -> ! { print_job_error_and_exit("uv trampoline failed to create job object", e); }); + // Assign the child to the job object so it gets terminated if the trampoline is killed. + // + // If the assignment fails, the child may outlive the trampoline on forced kill, but normal + // execution (child exits naturally) is unaffected so we ignore the failure. This matches + // `distlib`'s approach where `AssignProcessToJobObject` failure is non-fatal [1]. There are + // various plausible scenarios where we may fail to assign the child, including simple race + // conditions like the child process exiting before assignment. + // + // See also which explores a more robust solution + // at the cost of increased complexity. + // + // [1]: https://github.com/pypa/distlib/blob/37df85a61ead2ea2dc48d0e06f7bfe2f209a982c/PC/launcher.c#L835 + // // SAFETY: child_handle is a valid process handle returned by spawn_child. if let Err(e) = unsafe { job.assign_process(child_handle) } { - print_job_error_and_exit( - "uv trampoline failed to assign child process to job object", - e, + warn!( + "uv trampoline failed to assign child process to job object\n Caused by: {} (os error {})", + e.message(), + e.code(), ); }