diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-08-17 01:24:29 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-08-24 15:45:21 -0700 |
| commit | 5402786f94feac14adc337055eb0ca6c307b4f67 (patch) | |
| tree | 486bf7b50a4318f8297fdf275e451c983c28b6d5 /src/libstd/rt/local_ptr.rs | |
| parent | 468d023fe94aadbdc7b7dc0a83d264ee2ae0d68a (diff) | |
| download | rust-5402786f94feac14adc337055eb0ca6c307b4f67.tar.gz rust-5402786f94feac14adc337055eb0ca6c307b4f67.zip | |
std: More TLS micro-optimization
Diffstat (limited to 'src/libstd/rt/local_ptr.rs')
| -rw-r--r-- | src/libstd/rt/local_ptr.rs | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/libstd/rt/local_ptr.rs b/src/libstd/rt/local_ptr.rs index 77303cb8c06..491a864ebfe 100644 --- a/src/libstd/rt/local_ptr.rs +++ b/src/libstd/rt/local_ptr.rs @@ -40,6 +40,7 @@ pub fn init_tls_key() { /// # Safety note /// /// Does not validate the pointer type. +#[inline] pub unsafe fn put<T>(sched: ~T) { let key = tls_key(); let void_ptr: *mut c_void = cast::transmute(sched); @@ -51,6 +52,7 @@ pub unsafe fn put<T>(sched: ~T) { /// # Safety note /// /// Does not validate the pointer type. +#[inline] pub unsafe fn take<T>() -> ~T { let key = tls_key(); let void_ptr: *mut c_void = tls::get(key); @@ -99,10 +101,15 @@ pub unsafe fn borrow<T>(f: &fn(&mut T)) { /// Because this leaves the value in thread-local storage it is possible /// For the Scheduler pointer to be aliased pub unsafe fn unsafe_borrow<T>() -> *mut T { - match try_unsafe_borrow() { - Some(p) => p, - None => rtabort!("thread-local pointer is null. bogus!") + let key = tls_key(); + let mut void_ptr: *mut c_void = tls::get(key); + if void_ptr.is_null() { + rtabort!("thread-local pointer is null. bogus!"); } + let ptr: *mut *mut c_void = &mut void_ptr; + let ptr: *mut ~T = ptr as *mut ~T; + let ptr: *mut T = &mut **ptr; + return ptr; } pub unsafe fn try_unsafe_borrow<T>() -> Option<*mut T> { @@ -119,6 +126,7 @@ pub unsafe fn try_unsafe_borrow<T>() -> Option<*mut T> { } } +#[inline] fn tls_key() -> tls::Key { match maybe_tls_key() { Some(key) => key, |
