From 1303687d4811e8c3e261e14adbfb9850b23ff973 Mon Sep 17 00:00:00 2001 From: arcnmx Date: Sun, 18 Oct 2015 20:01:55 -0400 Subject: [PATCH] Clean up thread::spawn --- src/libstd/thread/mod.rs | 39 ++++++++++++++++----------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs index 134b1ce16e2..9b8f63997b6 100644 --- a/src/libstd/thread/mod.rs +++ b/src/libstd/thread/mod.rs @@ -162,7 +162,6 @@ use prelude::v1::*; -use alloc::boxed::FnBox; use any::Any; use cell::UnsafeCell; use fmt; @@ -249,16 +248,6 @@ pub fn stack_size(mut self, size: usize) -> Builder { pub fn spawn(self, f: F) -> io::Result> where F: FnOnce() -> T, F: Send + 'static, T: Send + 'static { - unsafe { - self.spawn_inner(Box::new(f)).map(JoinHandle) - } - } - - // NB: this function is unsafe as the lifetime parameter of the code to run - // in the new thread is not tied into the return value, and the return - // value must not outlast that lifetime. - unsafe fn spawn_inner<'a, T: Send>(self, f: Box T + Send + 'a>) - -> io::Result> { let Builder { name, stack_size } = self; let stack_size = stack_size.unwrap_or(util::min_stack()); @@ -274,22 +263,26 @@ unsafe fn spawn_inner<'a, T: Send>(self, f: Box T + Send + 'a>) if let Some(name) = their_thread.name() { imp::Thread::set_name(name); } - thread_info::set(imp::guard::current(), their_thread); - let mut output = None; - let try_result = { - let ptr = &mut output; - unwind::try(move || *ptr = Some(f())) - }; - *their_packet.get() = Some(try_result.map(|()| { - output.unwrap() - })); + unsafe { + thread_info::set(imp::guard::current(), their_thread); + let mut output = None; + let try_result = { + let ptr = &mut output; + unwind::try(move || *ptr = Some(f())) + }; + *their_packet.get() = Some(try_result.map(|()| { + output.unwrap() + })); + } }; - Ok(JoinInner { - native: Some(try!(imp::Thread::new(stack_size, Box::new(main)))), + Ok(JoinHandle(JoinInner { + native: unsafe { + Some(try!(imp::Thread::new(stack_size, Box::new(main)))) + }, thread: my_thread, packet: Packet(my_packet), - }) + })) } } -- GitLab