diff options
| author | Brian Anderson <banderson@mozilla.com> | 2013-08-17 17:40:38 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2013-08-24 15:46:01 -0700 |
| commit | 761f5fba69edb354cb3a02c01099f00c9bc56dc9 (patch) | |
| tree | 2a330bc5d2a665a3e06db3ba4af571127ac2ae68 /src/libstd/rt/local_ptr.rs | |
| parent | 5402786f94feac14adc337055eb0ca6c307b4f67 (diff) | |
| download | rust-761f5fba69edb354cb3a02c01099f00c9bc56dc9.tar.gz rust-761f5fba69edb354cb3a02c01099f00c9bc56dc9.zip | |
std::rt: Optimize TLS use in change_task_context
Diffstat (limited to 'src/libstd/rt/local_ptr.rs')
| -rw-r--r-- | src/libstd/rt/local_ptr.rs | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/libstd/rt/local_ptr.rs b/src/libstd/rt/local_ptr.rs index 491a864ebfe..3125a1da937 100644 --- a/src/libstd/rt/local_ptr.rs +++ b/src/libstd/rt/local_ptr.rs @@ -64,6 +64,23 @@ pub unsafe fn take<T>() -> ~T { return ptr; } +/// Take ownership of a pointer from thread-local storage. +/// +/// # Safety note +/// +/// Does not validate the pointer type. +/// Leaves the old pointer in TLS for speed. +#[inline] +pub unsafe fn unsafe_take<T>() -> ~T { + let key = tls_key(); + let void_ptr: *mut c_void = tls::get(key); + if void_ptr.is_null() { + rtabort!("thread-local pointer is null. bogus!"); + } + let ptr: ~T = cast::transmute(void_ptr); + return ptr; +} + /// Check whether there is a thread-local pointer installed. pub fn exists() -> bool { unsafe { |
