Skip to content

Commit 5a3e2a4

Browse files
committedJun 24, 2024
Auto merge of #126523 - joboet:the_great_big_tls_refactor, r=Mark-Simulacrum
std: refactor the TLS implementation As discovered by Mara in #110897, our TLS implementation is a total mess. In the past months, I have simplified the actual macros and their expansions, but the majority of the complexity comes from the platform-specific support code needed to create keys and register destructors. In keeping with #117276, I have therefore moved all of the `thread_local_key`/`thread_local_dtor` modules to the `thread_local` module in `sys` and merged them into a new structure, so that future porters of `std` can simply mix-and-match the existing code instead of having to copy the same (bad) implementation everywhere. The new structure should become obvious when looking at `sys/thread_local/mod.rs`. Unfortunately, the documentation changes associated with the refactoring have made this PR rather large. That said, this contains no functional changes except for two small ones: * the key-based destructor fallback now, by virtue of sharing the implementation used by macOS and others, stores its list in a `#[thread_local]` static instead of in the key, eliminating one indirection layer and drastically simplifying its code. * I've switched over ZKVM (tier 3) to use the same implementation as WebAssembly, as the implementation was just a way worse version of that Please let me know if I can make this easier to review! I know these large PRs aren't optimal, but I couldn't think of any good intermediate steps. `@rustbot` label +A-thread-locals
2 parents d371d17 + 50a02ed commit 5a3e2a4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+736
-931
lines changed
 

‎library/std/src/sys/pal/hermit/mod.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ pub mod pipe;
3232
pub mod process;
3333
pub mod stdio;
3434
pub mod thread;
35-
pub mod thread_local_dtor;
36-
#[path = "../unsupported/thread_local_key.rs"]
37-
pub mod thread_local_key;
3835
pub mod time;
3936

4037
use crate::io::ErrorKind;
@@ -97,7 +94,6 @@ pub unsafe extern "C" fn runtime_entry(
9794
argv: *const *const c_char,
9895
env: *const *const c_char,
9996
) -> ! {
100-
use thread_local_dtor::run_dtors;
10197
extern "C" {
10298
fn main(argc: isize, argv: *const *const c_char) -> i32;
10399
}
@@ -107,7 +103,7 @@ pub unsafe extern "C" fn runtime_entry(
107103

108104
let result = main(argc as isize, argv);
109105

110-
run_dtors();
106+
crate::sys::thread_local::destructors::run();
111107
hermit_abi::exit(result);
112108
}
113109

‎library/std/src/sys/pal/hermit/thread.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#![allow(dead_code)]
22

33
use super::hermit_abi;
4-
use super::thread_local_dtor::run_dtors;
54
use crate::ffi::CStr;
65
use crate::io;
76
use crate::mem;
@@ -50,7 +49,7 @@ impl Thread {
5049
Box::from_raw(ptr::with_exposed_provenance::<Box<dyn FnOnce()>>(main).cast_mut())();
5150

5251
// run all destructors
53-
run_dtors();
52+
crate::sys::thread_local::destructors::run();
5453
}
5554
}
5655
}

0 commit comments

Comments
 (0)