From a4b1ac5447c44b5ad5923653ed2091e0510ac8db Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 24 Nov 2014 15:24:29 -0800 Subject: [PATCH] std: Leak all statically allocated TLS keys 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 --- src/libstd/sys/common/thread_local.rs | 37 ++------------------------- 1 file 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 @@ pub unsafe fn set(&self, val: *mut u8) { imp::set(self.key(), val) } 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 @@ unsafe fn lazy_init(&self) -> uint { 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 @@ fn drop(&mut self) { } } -fn init_keys() { - let keys = box Exclusive::new(Vec::::new()); - unsafe { - KEYS = mem::transmute(keys); - } - - rustrt::at_exit(proc() unsafe { - let keys: Box>> = 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::*; -- 2.44.0