std/sys/thread_local/
mod.rs1#![cfg_attr(test, allow(unused))]
18#![doc(hidden)]
19#![forbid(unsafe_op_in_unsafe_fn)]
20#![unstable(
21 feature = "thread_local_internals",
22 reason = "internal details of the thread_local macro",
23 issue = "none"
24)]
25#![deny(
26 clippy::arithmetic_side_effects,
27 clippy::expect_used,
28 clippy::unwrap_used,
29 clippy::indexing_slicing,
30 clippy::panic,
31 clippy::unreachable,
32 clippy::unimplemented,
33 reason = "TLS accesses must not call the global allocator, including via panic (#160930)"
34)]
35
36cfg_select! {
37 any(
38 all(target_family = "wasm", not(target_feature = "atomics"), not(target_env = "p3")),
39 target_os = "uefi",
40 target_os = "zkvm",
41 target_os = "trusty",
42 target_os = "vexos",
43 ) => {
44 mod no_threads;
45 pub use no_threads::{EagerStorage, LazyStorage, thread_local_inner};
46 pub(crate) use no_threads::{LocalPointer, local_pointer};
47 }
48 target_thread_local => {
49 mod native;
50 pub use native::{EagerStorage, LazyStorage, thread_local_inner};
51 pub(crate) use native::{LocalPointer, local_pointer};
52 }
53 _ => {
54 mod os;
55 pub(crate) use os::{LocalPointer, local_pointer};
56 pub use os::{Storage, thread_local_inner, value_align};
57 }
58}
59
60#[cfg(all(
68 target_thread_local,
69 not(all(target_family = "wasm", not(target_feature = "atomics"), not(target_env = "p3")))
70))]
71pub(crate) mod destructors {
72 cfg_select! {
73 any(
74 target_os = "linux",
75 target_os = "android",
76 target_os = "fuchsia",
77 target_os = "redox",
78 target_os = "hurd",
79 target_os = "netbsd",
80 target_os = "dragonfly"
81 ) => {
82 mod linux_like;
83 mod list;
84 pub(super) use linux_like::register;
85 pub(super) use list::run;
86 }
87 _ => {
88 mod list;
89 pub(super) use list::register;
90 pub(crate) use list::run;
91 }
92 }
93}
94
95pub(crate) mod guard {
99 cfg_select! {
100 all(target_thread_local, target_vendor = "apple") => {
101 mod apple;
102 pub(crate) use apple::enable;
103 }
104 target_os = "windows" => {
105 mod windows;
106 pub(crate) use windows::enable;
107 }
108 any(
109 all(target_family = "wasm", not(target_env = "p3")),
110 target_os = "uefi",
111 target_os = "zkvm",
112 target_os = "trusty",
113 target_os = "vexos",
114 ) => {
115 pub(crate) fn enable() {
116 #[cfg(all(target_family = "wasm", target_feature = "atomics"))]
123 #[allow(unused)]
124 use super::destructors::run;
125 #[allow(unused)]
126 use crate::rt::thread_cleanup;
127 }
128 }
129 any(target_os = "hermit", target_os = "xous") => {
130 pub(crate) fn enable() {}
133 }
134 target_os = "solid_asp3" => {
135 mod solid;
136 pub(crate) use solid::enable;
137 }
138 _ => {
139 mod key;
140 pub(crate) use key::enable;
141 }
142 }
143}
144
145pub(crate) mod key {
152 cfg_select! {
153 any(
154 all(not(target_vendor = "apple"), not(target_family = "wasm"), target_family = "unix"),
155 all(not(target_thread_local), target_vendor = "apple"),
156 target_os = "teeos",
157 all(target_os = "wasi", target_env = "p3"),
158 ) => {
159 mod racy;
160 mod unix;
161 #[cfg(test)]
162 mod tests;
163 pub(super) use racy::LazyKey;
164 #[cfg(any(not(target_thread_local), test))]
165 pub(super) use unix::get;
166 pub(super) use unix::{Key, set};
167 use unix::{create, destroy};
168 }
169 all(not(target_thread_local), target_os = "windows") => {
170 #[cfg(test)]
171 mod tests;
172 mod windows;
173 pub(super) use windows::{Key, LazyKey, get, run_dtors, set};
174 }
175 all(target_vendor = "fortanix", target_env = "sgx") => {
176 mod racy;
177 mod sgx;
178 #[cfg(test)]
179 mod tests;
180 pub(super) use racy::LazyKey;
181 pub(super) use sgx::{Key, get, set};
182 use sgx::{create, destroy};
183 }
184 target_os = "xous" => {
185 mod racy;
186 #[cfg(test)]
187 mod tests;
188 mod xous;
189 pub(super) use racy::LazyKey;
190 pub(crate) use xous::destroy_tls;
191 pub(super) use xous::{Key, get, set};
192 use xous::{create, destroy};
193 }
194 target_os = "motor" => {
195 mod racy;
196 #[cfg(test)]
197 mod tests;
198 pub(super) use moto_rt::tls::{Key, get, set};
199 use moto_rt::tls::{create, destroy};
200 pub(super) use racy::LazyKey;
201 }
202 _ => {}
203 }
204}
205
206#[inline]
210#[allow(dead_code)]
211fn abort_on_dtor_unwind(f: impl FnOnce()) {
212 let guard = DtorUnwindGuard;
214 f();
215 core::mem::forget(guard);
216
217 struct DtorUnwindGuard;
218 impl Drop for DtorUnwindGuard {
219 #[inline]
220 fn drop(&mut self) {
221 rtabort!("thread local panicked on drop");
224 }
225 }
226}