diff options
| author | Stepan Koltsov <stepan.koltsov@gmail.com> | 2015-02-23 02:58:22 +0300 |
|---|---|---|
| committer | Stepan Koltsov <stepan.koltsov@gmail.com> | 2015-02-23 02:59:17 +0300 |
| commit | 26d9f0ab1aeb3d7b440911104cf17741f83aa0f5 (patch) | |
| tree | eea0a5891102880a9ce3bb76a8d3098f263aa7a9 /src/libstd/thread_local | |
| parent | 554022e58392b173092e707b4c553713d07ed44d (diff) | |
| download | rust-26d9f0ab1aeb3d7b440911104cf17741f83aa0f5.tar.gz rust-26d9f0ab1aeb3d7b440911104cf17741f83aa0f5.zip | |
Use boxed functions instead of transmute
... to convert between Box and raw pointers. E. g. use ``` let b: Box<Foo> = Box::from_raw(p); ``` instead of ``` let b: Box<Foo> = mem::transmute(p); ``` Patch also changes closure release code in `src/libstd/sys/unix/thread.rs` when `pthread_create` failed. Raw pointer was transmuted to box of `FnOnce()` instead of `Thunk`. This code was probably never executed, because `pthread_create` rarely fails in practice.
Diffstat (limited to 'src/libstd/thread_local')
| -rw-r--r-- | src/libstd/thread_local/mod.rs | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/libstd/thread_local/mod.rs b/src/libstd/thread_local/mod.rs index 2ed296e081c..9549ae14b88 100644 --- a/src/libstd/thread_local/mod.rs +++ b/src/libstd/thread_local/mod.rs @@ -330,6 +330,7 @@ impl<T: 'static> Key<T> { mod imp { use prelude::v1::*; + use alloc::boxed; use cell::UnsafeCell; use intrinsics; use ptr; @@ -422,14 +423,14 @@ mod imp { type List = Vec<(*mut u8, unsafe extern fn(*mut u8))>; if DTORS.get().is_null() { let v: Box<List> = box Vec::new(); - DTORS.set(mem::transmute(v)); + DTORS.set(boxed::into_raw(v) as *mut u8); } let list: &mut List = &mut *(DTORS.get() as *mut List); list.push((t, dtor)); unsafe extern fn run_dtors(mut ptr: *mut u8) { while !ptr.is_null() { - let list: Box<List> = mem::transmute(ptr); + let list: Box<List> = Box::from_raw(ptr as *mut List); for &(ptr, dtor) in &*list { dtor(ptr); } @@ -467,6 +468,7 @@ mod imp { mod imp { use prelude::v1::*; + use alloc::boxed; use cell::UnsafeCell; use mem; use ptr; @@ -517,7 +519,7 @@ mod imp { key: self, value: mem::transmute_copy(&self.inner), }; - let ptr: *mut Value<T> = mem::transmute(ptr); + let ptr: *mut Value<T> = boxed::into_raw(ptr); self.os.set(ptr as *mut u8); Some(&mut (*ptr).value as *mut T) } @@ -533,7 +535,7 @@ mod imp { // // Note that to prevent an infinite loop we reset it back to null right // before we return from the destructor ourselves. - let ptr: Box<Value<T>> = mem::transmute(ptr); + let ptr: Box<Value<T>> = Box::from_raw(ptr as *mut Value<T>); let key = ptr.key; key.os.set(1 as *mut u8); drop(ptr); |
