9f91c5099f
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.
25 lines
549 B
Rust
25 lines
549 B
Rust
//@ 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());
|
|
}
|