summary refs log tree commit diff
path: root/library
diff options
context:
space:
mode:
authorMara Bos <m-ou.se@m-ou.se>2024-05-22 14:16:33 +0200
committerMara Bos <m-ou.se@m-ou.se>2024-11-19 18:54:20 +0100
commitef9055f3eef409e99e1e786f6a90a1684fde810d (patch)
tree83c68e06b52891d7dad7355fe9d263eec013ab16 /library
parent7ac4c04731ecb6eedd63a1f899a0c6207679cbf9 (diff)
downloadrust-ef9055f3eef409e99e1e786f6a90a1684fde810d.tar.gz
rust-ef9055f3eef409e99e1e786f6a90a1684fde810d.zip
Use add_spawn_hook for libtest's output capturing.
Diffstat (limited to 'library')
-rw-r--r--library/std/src/thread/mod.rs4
-rw-r--r--library/test/src/lib.rs11
2 files changed, 11 insertions, 4 deletions
diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index ee8d688398d..c6b1e0de84c 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -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();
             }
diff --git a/library/test/src/lib.rs b/library/test/src/lib.rs
index 30ccfe2af8d..00a0b55c6a9 100644
--- a/library/test/src/lib.rs
+++ b/library/test/src/lib.rs
@@ -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.