about summary refs log tree commit diff
path: root/src/libstd/thread
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-09-07 06:52:05 +0000
committerbors <bors@rust-lang.org>2017-09-07 06:52:05 +0000
commitd7d75eff30ff03f607ff0656a50f4be768cfdbc9 (patch)
treef4b1b8c6ed97239450a2e468e0fbda720f005bc9 /src/libstd/thread
parenta6a9d4c5fd214cb8110482dee2017607e23ccc7b (diff)
parent4e2be14986b022dfdf5efa73293566cc6faf570e (diff)
downloadrust-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.rs16
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);
     }
 }