about summary refs log tree commit diff
path: root/src/libstd/sys/windows
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-06-24 04:42:18 +0000
committerbors <bors@rust-lang.org>2017-06-24 04:42:18 +0000
commit1ccc330d4b4741bbc0388fb55eb37b7b94f903d5 (patch)
treeaaade9b315e98c22d41c6772b4808fbf494ea365 /src/libstd/sys/windows
parent229d0d3266002d343cdd2f4a3bf7f2fe9da15f38 (diff)
parent06540cb205545e5e7e509933af27142ca35eae17 (diff)
downloadrust-1ccc330d4b4741bbc0388fb55eb37b7b94f903d5.tar.gz
rust-1ccc330d4b4741bbc0388fb55eb37b7b94f903d5.zip
Auto merge of #42687 - alexcrichton:windows-tls, r=sfackler
rustc: Enable #[thread_local] for Windows

I think LLVM has had support for quite some time now for this, we just never got
around to testing it out and binding it. We've had some trouble landing this in
the past I believe, but it's time to try again!

This commit flags the `#[thread_local]` attribute as being available for Windows
targets and adds an implementation of `register_dtor` in the `thread::local`
module to ensure we can destroy these keys. The same functionality is
implemented in clang via a function called `__tlregdtor` (presumably provided in
some Windows runtime somewhere), but this function unfortunately does not take a
data pointer (just a thunk) which means we can't easily call it. For now
destructors are just run in the same way the Linux fallback is implemented,
which is just keeping track via a single OS-based TLS key.
Diffstat (limited to 'src/libstd/sys/windows')
-rw-r--r--src/libstd/sys/windows/fast_thread_local.rs18
-rw-r--r--src/libstd/sys/windows/mod.rs1
2 files changed, 19 insertions, 0 deletions
diff --git a/src/libstd/sys/windows/fast_thread_local.rs b/src/libstd/sys/windows/fast_thread_local.rs
new file mode 100644
index 00000000000..9fee9bd93b4
--- /dev/null
+++ b/src/libstd/sys/windows/fast_thread_local.rs
@@ -0,0 +1,18 @@
+// Copyright 2014-2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![unstable(feature = "thread_local_internals", issue = "0")]
+#![cfg(target_thread_local)]
+
+pub use sys_common::thread_local::register_dtor_fallback as register_dtor;
+
+pub fn requires_move_before_drop() -> bool {
+    false
+}
diff --git a/src/libstd/sys/windows/mod.rs b/src/libstd/sys/windows/mod.rs
index 4424c6c6136..840e7fdfc9b 100644
--- a/src/libstd/sys/windows/mod.rs
+++ b/src/libstd/sys/windows/mod.rs
@@ -26,6 +26,7 @@ pub mod condvar;
 pub mod dynamic_lib;
 pub mod env;
 pub mod ext;
+pub mod fast_thread_local;
 pub mod fs;
 pub mod handle;
 pub mod memchr;