Use add_spawn_hook for libtest's output capturing.

This commit is contained in:
Mara Bos 2024-05-22 14:16:33 +02:00
parent 7ac4c04731
commit ef9055f3ee
2 changed files with 11 additions and 4 deletions

View File

@ -502,9 +502,6 @@ impl Builder {
});
let their_packet = my_packet.clone();
let output_capture = crate::io::set_output_capture(None);
crate::io::set_output_capture(output_capture.clone());
// Pass `f` in `MaybeUninit` because actually that closure might *run longer than the lifetime of `F`*.
// See <https://github.com/rust-lang/rust/issues/101983> for more details.
// To prevent leaks we use a wrapper that drops its contents.
@ -542,7 +539,6 @@ impl Builder {
imp::Thread::set_name(name);
}
crate::io::set_output_capture(output_capture);
for hook in hooks {
hook();
}

View File

@ -24,6 +24,7 @@
#![feature(process_exitcode_internals)]
#![feature(panic_can_unwind)]
#![feature(test)]
#![feature(thread_spawn_hook)]
#![allow(internal_features)]
#![warn(rustdoc::unescaped_backticks)]
@ -134,6 +135,16 @@ pub fn test_main(args: &[String], tests: Vec<TestDescAndFn>, options: Option<Opt
}
});
panic::set_hook(hook);
// Use a thread spawning hook to make new threads inherit output capturing.
std::thread::add_spawn_hook(|_| {
// Get and clone the output capture of the current thread.
let output_capture = io::set_output_capture(None);
io::set_output_capture(output_capture.clone());
// Set the output capture of the new thread.
Ok(|| {
io::set_output_capture(output_capture);
})
});
}
let res = console::run_tests_console(&opts, tests);
// Prevent Valgrind from reporting reachable blocks in users' unit tests.