diff options
| author | bors <bors@rust-lang.org> | 2015-10-19 12:45:25 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-10-19 12:45:25 +0000 |
| commit | 7aec91734e0c12b8e36158566ad512a663111c9f (patch) | |
| tree | d2d3e5a0092bbf9e6f5c1f5d4cf955114e17a384 /src | |
| parent | 3e268f2fbafca7e0a59bf77e17985a27c61d5a11 (diff) | |
| parent | 1303687d4811e8c3e261e14adbfb9850b23ff973 (diff) | |
| download | rust-7aec91734e0c12b8e36158566ad512a663111c9f.tar.gz rust-7aec91734e0c12b8e36158566ad512a663111c9f.zip | |
Auto merge of #29153 - arcnmx:thread-spawn, r=alexcrichton
Fixes #29128 Most of the weird lifetime things and `inner` stuff seems like leftover cruft from `thread::scoped`. Should `JoinInner` just be removed/merged with `JoinHandle`? Also is it okay to remove the `FnBox`? I'm not really sure why there were two allocations there...
Diffstat (limited to 'src')
| -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), - }) + })) } } |
