From 8fc1d9db21fa9d4abd9b40d09be8fa061abb3bb5 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 17 Aug 2013 02:12:08 -0700 Subject: std: Convert the runtime TLS key to a Rust global to avoid FFI --- src/libstd/rt/local_ptr.rs | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'src/libstd/rt/local_ptr.rs') diff --git a/src/libstd/rt/local_ptr.rs b/src/libstd/rt/local_ptr.rs index 3125a1da937..e843fd1adef 100644 --- a/src/libstd/rt/local_ptr.rs +++ b/src/libstd/rt/local_ptr.rs @@ -23,14 +23,16 @@ use option::{Option, Some, None}; use unstable::finally::Finally; use tls = rt::thread_local_storage; +static mut RT_TLS_KEY: tls::Key = -1; + /// Initialize the TLS key. Other ops will fail if this isn't executed first. #[fixed_stack_segment] #[inline(never)] pub fn init_tls_key() { unsafe { - rust_initialize_rt_tls_key(); + rust_initialize_rt_tls_key(&mut RT_TLS_KEY); extern { - fn rust_initialize_rt_tls_key(); + fn rust_initialize_rt_tls_key(key: *mut tls::Key); } } } @@ -151,15 +153,10 @@ fn tls_key() -> tls::Key { } } -#[fixed_stack_segment] -#[inline(never)] -fn maybe_tls_key() -> Option { +#[inline] +#[cfg(not(test))] +pub fn maybe_tls_key() -> Option { unsafe { - let key: *mut c_void = rust_get_rt_tls_key(); - let key: &mut tls::Key = cast::transmute(key); - let key = *key; - // Check that the key has been initialized. - // NB: This is a little racy because, while the key is // initalized under a mutex and it's assumed to be initalized // in the Scheduler ctor by any thread that needs to use it, @@ -170,14 +167,19 @@ fn maybe_tls_key() -> Option { // another thread. I think this is fine since the only action // they could take if it was initialized would be to check the // thread-local value and see that it's not set. - if key != -1 { - return Some(key); + if RT_TLS_KEY != -1 { + return Some(RT_TLS_KEY); } else { return None; } } +} - extern { - fn rust_get_rt_tls_key() -> *mut c_void; - } +// XXX: The boundary between the running runtime and the testing runtime +// seems to be fuzzy at the moment, and trying to use two different keys +// results in disaster. This should not be necessary. +#[inline] +#[cfg(test)] +pub fn maybe_tls_key() -> Option { + unsafe { ::cast::transmute(::realstd::rt::local_ptr::maybe_tls_key()) } } -- cgit 1.4.1-3-g733a5