diff options
| author | arcnmx <arcnmx@users.noreply.github.com> | 2015-10-18 20:01:55 -0400 |
|---|---|---|
| committer | arcnmx <arcnmx@users.noreply.github.com> | 2015-10-18 20:03:09 -0400 |
| commit | 1303687d4811e8c3e261e14adbfb9850b23ff973 (patch) | |
| tree | a15754ba1aba48028a56989ff9ef03b1bc150434 /src/libstd/thread | |
| parent | d3f497861d426c8724dd84f161ca21f274663963 (diff) | |
| download | rust-1303687d4811e8c3e261e14adbfb9850b23ff973.tar.gz rust-1303687d4811e8c3e261e14adbfb9850b23ff973.zip | |
Clean up thread::spawn
Diffstat (limited to 'src/libstd/thread')
| -rw-r--r-- | src/libstd/thread/mod.rs | 39 |
1 files 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 @@ impl Builder { pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> 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<FnBox() -> T + Send + 'a>) - -> io::Result<JoinInner<T>> { let Builder { name, stack_size } = self; let stack_size = stack_size.unwrap_or(util::min_stack()); @@ -274,22 +263,26 @@ impl Builder { 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), - }) + })) } } |
