Skip to content

Commit

Permalink
auto merge of #19285 : alexcrichton/rust/issue-19280, r=aturon
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bors committed Nov 25, 2014
2 parents 5acb97a + a4b1ac5 commit 5f9741e
Showing 1 changed file with 2 additions and 35 deletions.
37 changes: 2 additions & 35 deletions src/libstd/sys/common/thread_local.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand Down Expand Up @@ -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) }
}
}

Expand All @@ -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 }
}
Expand Down Expand Up @@ -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::*;
Expand Down

0 comments on commit 5f9741e

Please sign in to comment.