diff options
| author | bors <bors@rust-lang.org> | 2017-09-07 06:52:05 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-09-07 06:52:05 +0000 |
| commit | d7d75eff30ff03f607ff0656a50f4be768cfdbc9 (patch) | |
| tree | f4b1b8c6ed97239450a2e468e0fbda720f005bc9 /src/libstd/thread | |
| parent | a6a9d4c5fd214cb8110482dee2017607e23ccc7b (diff) | |
| parent | 4e2be14986b022dfdf5efa73293566cc6faf570e (diff) | |
| download | rust-d7d75eff30ff03f607ff0656a50f4be768cfdbc9.tar.gz rust-d7d75eff30ff03f607ff0656a50f4be768cfdbc9.zip | |
Auto merge of #43931 - eddyb:const-local-key, r=alexcrichton
Make the LocalKey facade of thread_local! inlineable cross-crate. Fixes (almost*) #25088 by changing the `LocalKey` `static` `thread_local!` generates to a `const`. This can be done because a `LocalKey` value holds no actual TLS data, only function pointers to get at said data, and it could even be made `Copy` without any negative consequences. The recent stabilization of rvalue promotion to `'static` allows doing this without changing the API. r? @alexcrichton *almost because we can't yet inline `__getit` because it breaks on MSVC, see https://github.com/rust-lang/rust/pull/43931#issuecomment-323534214
Diffstat (limited to 'src/libstd/thread')
| -rw-r--r-- | src/libstd/thread/local.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/libstd/thread/local.rs b/src/libstd/thread/local.rs index 02347bf4906..4ee8132f55c 100644 --- a/src/libstd/thread/local.rs +++ b/src/libstd/thread/local.rs @@ -159,8 +159,9 @@ macro_rules! thread_local { #[allow_internal_unstable] #[allow_internal_unsafe] macro_rules! __thread_local_inner { - ($(#[$attr:meta])* $vis:vis $name:ident, $t:ty, $init:expr) => { - $(#[$attr])* $vis static $name: $crate::thread::LocalKey<$t> = { + (@key $(#[$attr:meta])* $vis:vis $name:ident, $t:ty, $init:expr) => { + { + #[inline] fn __init() -> $t { $init } unsafe fn __getit() -> $crate::option::Option< @@ -182,7 +183,16 @@ macro_rules! __thread_local_inner { unsafe { $crate::thread::LocalKey::new(__getit, __init) } - }; + } + }; + ($(#[$attr:meta])* $vis:vis $name:ident, $t:ty, $init:expr) => { + #[cfg(stage0)] + $(#[$attr])* $vis static $name: $crate::thread::LocalKey<$t> = + __thread_local_inner!(@key $(#[$attr])* $vis $name, $t, $init); + + #[cfg(not(stage0))] + $(#[$attr])* $vis const $name: $crate::thread::LocalKey<$t> = + __thread_local_inner!(@key $(#[$attr])* $vis $name, $t, $init); } } |
