about summary refs log tree commit diff
path: root/tests/ui
diff options
context:
space:
mode:
authorjoboet <jonasboettiger@icloud.com>2024-10-12 13:01:36 +0200
committerjoboet <jonasboettiger@icloud.com>2024-10-12 13:01:36 +0200
commit9f91c5099fb7261cf8c85cc638d2692a317060ec (patch)
tree76fd472a426886c63ef0415a944b9113a5ad1aaa /tests/ui
parent11ee3a830b8537976d54805331cc626604afbb63 (diff)
downloadrust-9f91c5099fb7261cf8c85cc638d2692a317060ec.tar.gz
rust-9f91c5099fb7261cf8c85cc638d2692a317060ec.zip
std: fix stdout-before-main
Fixes #130210.

Since #124881, `ReentrantLock` uses `ThreadId` to identify threads. This has the unfortunate consequence of breaking uses of `Stdout` before main: Locking the `ReentrantLock` that synchronizes the output will initialize the thread ID before the handle for the main thread is set in `rt::init`. But since that would overwrite the current thread ID, `thread::set_current` triggers an abort.

This PR fixes the problem by using the already initialized thread ID for constructing the main thread handle and allowing `set_current` calls that do not change the thread's ID.
Diffstat (limited to 'tests/ui')
-rw-r--r--tests/ui/runtime/stdout-before-main.rs24
-rw-r--r--tests/ui/runtime/stdout-before-main.run.stdout1
2 files changed, 25 insertions, 0 deletions
diff --git a/tests/ui/runtime/stdout-before-main.rs b/tests/ui/runtime/stdout-before-main.rs
new file mode 100644
index 00000000000..26c734d3e9e
--- /dev/null
+++ b/tests/ui/runtime/stdout-before-main.rs
@@ -0,0 +1,24 @@
+//@ run-pass
+//@ check-run-results
+//@ only-gnu
+//@ only-linux
+//
+// Regression test for #130210.
+// .init_array doesn't work everywhere, so we limit the test to just GNU/Linux.
+
+use std::ffi::c_int;
+use std::thread;
+
+#[used]
+#[link_section = ".init_array"]
+static INIT: extern "C" fn(c_int, *const *const u8, *const *const u8) = {
+    extern "C" fn init(_argc: c_int, _argv: *const *const u8, _envp: *const *const u8) {
+        print!("Hello from before ");
+    }
+
+    init
+};
+
+fn main() {
+    println!("{}!", thread::current().name().unwrap());
+}
diff --git a/tests/ui/runtime/stdout-before-main.run.stdout b/tests/ui/runtime/stdout-before-main.run.stdout
new file mode 100644
index 00000000000..d7a3a4389ec
--- /dev/null
+++ b/tests/ui/runtime/stdout-before-main.run.stdout
@@ -0,0 +1 @@
+Hello from before main!