From 26d9f0ab1aeb3d7b440911104cf17741f83aa0f5 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Mon, 23 Feb 2015 02:58:22 +0300 Subject: Use boxed functions instead of transmute ... to convert between Box and raw pointers. E. g. use ``` let b: Box = Box::from_raw(p); ``` instead of ``` let b: Box = 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. --- src/libstd/sys/common/helper_thread.rs | 6 +++--- src/libstd/sys/common/thread.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/libstd/sys/common') diff --git a/src/libstd/sys/common/helper_thread.rs b/src/libstd/sys/common/helper_thread.rs index dc1ae85efe0..5faaa928ee9 100644 --- a/src/libstd/sys/common/helper_thread.rs +++ b/src/libstd/sys/common/helper_thread.rs @@ -22,8 +22,8 @@ use prelude::v1::*; +use boxed; use cell::UnsafeCell; -use mem; use ptr; use rt; use sync::{StaticMutex, StaticCondvar}; @@ -88,7 +88,7 @@ impl Helper { let _guard = self.lock.lock().unwrap(); if !*self.initialized.get() { let (tx, rx) = channel(); - *self.chan.get() = mem::transmute(box tx); + *self.chan.get() = boxed::into_raw(box tx); let (receive, send) = helper_signal::new(); *self.signal.get() = send as uint; @@ -132,7 +132,7 @@ impl Helper { let mut guard = self.lock.lock().unwrap(); // Close the channel by destroying it - let chan: Box> = mem::transmute(*self.chan.get()); + let chan: Box> = Box::from_raw(*self.chan.get()); *self.chan.get() = ptr::null_mut(); drop(chan); helper_signal::signal(*self.signal.get() as helper_signal::signal); diff --git a/src/libstd/sys/common/thread.rs b/src/libstd/sys/common/thread.rs index b725b6c7e6e..731617858e9 100644 --- a/src/libstd/sys/common/thread.rs +++ b/src/libstd/sys/common/thread.rs @@ -27,7 +27,7 @@ pub fn start_thread(main: *mut libc::c_void) -> thread::rust_thread_return { unsafe { stack::record_os_managed_stack_bounds(0, usize::MAX); let handler = stack_overflow::Handler::new(); - let f: Box = mem::transmute(main); + let f: Box = Box::from_raw(main as *mut Thunk); f.invoke(()); drop(handler); mem::transmute(0 as thread::rust_thread_return) -- cgit 1.4.1-3-g733a5