diff options
| author | joboet <jonasboettiger@icloud.com> | 2024-10-12 13:01:36 +0200 |
|---|---|---|
| committer | joboet <jonasboettiger@icloud.com> | 2024-10-12 13:01:36 +0200 |
| commit | 9f91c5099fb7261cf8c85cc638d2692a317060ec (patch) | |
| tree | 76fd472a426886c63ef0415a944b9113a5ad1aaa /tests/ui | |
| parent | 11ee3a830b8537976d54805331cc626604afbb63 (diff) | |
| download | rust-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.rs | 24 | ||||
| -rw-r--r-- | tests/ui/runtime/stdout-before-main.run.stdout | 1 |
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! |
