about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-11-25 01:06:41 +0000
committerbors <bors@rust-lang.org>2014-11-25 01:06:41 +0000
commit5f9741e62d7cfe26ca94a28716a95bc03d74e87a (patch)
tree3b8b8bcea9ae24b888987acf948f21b9c5a70075 /src/libstd
parent5acb97ae76aeaeed9b4d78a613aa448ea815d74e (diff)
parenta4b1ac5447c44b5ad5923653ed2091e0510ac8db (diff)
downloadrust-5f9741e62d7cfe26ca94a28716a95bc03d74e87a.tar.gz
rust-5f9741e62d7cfe26ca94a28716a95bc03d74e87a.zip
auto merge of #19285 : alexcrichton/rust/issue-19280, r=aturon
It turns out that rustrt::at_exit() doesn't actually occur after all pthread
threads have exited (nor does atexit()), so there's not actually a known point
at which we can deallocate these keys. It's not super critical that we do so,
however, because we're about to exit anyway!

Closes #19280
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/sys/common/thread_local.rs37
1 files changed, 2 insertions, 35 deletions
diff --git a/src/libstd/sys/common/thread_local.rs b/src/libstd/sys/common/thread_local.rs
index 9ad38cbaf65..370d74cc5e1 100644
--- a/src/libstd/sys/common/thread_local.rs
+++ b/src/libstd/sys/common/thread_local.rs
@@ -59,9 +59,7 @@
 use prelude::*;
 
 use kinds::marker;
-use mem;
 use rustrt::exclusive::Exclusive;
-use rustrt;
 use sync::atomic::{mod, AtomicUint};
 use sync::{Once, ONCE_INIT};
 
@@ -174,7 +172,7 @@ impl StaticKey {
     pub unsafe fn destroy(&self) {
         match self.inner.key.swap(0, atomic::SeqCst) {
             0 => {}
-            n => { unregister_key(n as imp::Key); imp::destroy(n as imp::Key) }
+            n => { imp::destroy(n as imp::Key) }
         }
     }
 
@@ -191,10 +189,7 @@ impl StaticKey {
         assert!(key != 0);
         match self.inner.key.compare_and_swap(0, key as uint, atomic::SeqCst) {
             // The CAS succeeded, so we've created the actual key
-            0 => {
-                register_key(key);
-                key as uint
-            }
+            0 => key as uint,
             // If someone beat us to the punch, use their key instead
             n => { imp::destroy(key); n }
         }
@@ -237,34 +232,6 @@ impl Drop for Key {
     }
 }
 
-fn init_keys() {
-    let keys = box Exclusive::new(Vec::<imp::Key>::new());
-    unsafe {
-        KEYS = mem::transmute(keys);
-    }
-
-    rustrt::at_exit(proc() unsafe {
-        let keys: Box<Exclusive<Vec<imp::Key>>> = mem::transmute(KEYS);
-        KEYS = 0 as *mut _;
-        let keys = keys.lock();
-        for key in keys.iter() {
-            imp::destroy(*key);
-        }
-    });
-}
-
-fn register_key(key: imp::Key) {
-    INIT_KEYS.doit(init_keys);
-    let mut keys = unsafe { (*KEYS).lock() };
-    keys.push(key);
-}
-
-fn unregister_key(key: imp::Key) {
-    INIT_KEYS.doit(init_keys);
-    let mut keys = unsafe { (*KEYS).lock() };
-    keys.retain(|k| *k != key);
-}
-
 #[cfg(test)]
 mod tests {
     use prelude::*;