diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-08-17 02:12:08 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-08-24 15:46:03 -0700 |
| commit | 8fc1d9db21fa9d4abd9b40d09be8fa061abb3bb5 (patch) | |
| tree | 543ee79365aff171c5555d4a0582696619c298a7 /src/libstd/rt | |
| parent | a37bdde3f9c0b711ecfbaffa5b00b8272d76b131 (diff) | |
| download | rust-8fc1d9db21fa9d4abd9b40d09be8fa061abb3bb5.tar.gz rust-8fc1d9db21fa9d4abd9b40d09be8fa061abb3bb5.zip | |
std: Convert the runtime TLS key to a Rust global to avoid FFI
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/local_ptr.rs | 32 |
1 files changed, 17 insertions, 15 deletions
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<tls::Key> { +#[inline] +#[cfg(not(test))] +pub fn maybe_tls_key() -> Option<tls::Key> { 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<tls::Key> { // 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<tls::Key> { + unsafe { ::cast::transmute(::realstd::rt::local_ptr::maybe_tls_key()) } } |
