提交 1303687d 编写于 作者: A arcnmx

Clean up thread::spawn

上级 d3f49786
...@@ -162,7 +162,6 @@ ...@@ -162,7 +162,6 @@
use prelude::v1::*; use prelude::v1::*;
use alloc::boxed::FnBox;
use any::Any; use any::Any;
use cell::UnsafeCell; use cell::UnsafeCell;
use fmt; use fmt;
...@@ -249,16 +248,6 @@ pub fn stack_size(mut self, size: usize) -> Builder { ...@@ -249,16 +248,6 @@ pub fn stack_size(mut self, size: usize) -> Builder {
pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> where pub fn spawn<F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
F: FnOnce() -> T, F: Send + 'static, T: Send + 'static 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 Builder { name, stack_size } = self;
let stack_size = stack_size.unwrap_or(util::min_stack()); let stack_size = stack_size.unwrap_or(util::min_stack());
...@@ -274,22 +263,26 @@ unsafe fn spawn_inner<'a, T: Send>(self, f: Box<FnBox() -> T + Send + 'a>) ...@@ -274,22 +263,26 @@ unsafe fn spawn_inner<'a, T: Send>(self, f: Box<FnBox() -> T + Send + 'a>)
if let Some(name) = their_thread.name() { if let Some(name) = their_thread.name() {
imp::Thread::set_name(name); imp::Thread::set_name(name);
} }
thread_info::set(imp::guard::current(), their_thread); unsafe {
let mut output = None; thread_info::set(imp::guard::current(), their_thread);
let try_result = { let mut output = None;
let ptr = &mut output; let try_result = {
unwind::try(move || *ptr = Some(f())) let ptr = &mut output;
}; unwind::try(move || *ptr = Some(f()))
*their_packet.get() = Some(try_result.map(|()| { };
output.unwrap() *their_packet.get() = Some(try_result.map(|()| {
})); output.unwrap()
}));
}
}; };
Ok(JoinInner { Ok(JoinHandle(JoinInner {
native: Some(try!(imp::Thread::new(stack_size, Box::new(main)))), native: unsafe {
Some(try!(imp::Thread::new(stack_size, Box::new(main))))
},
thread: my_thread, thread: my_thread,
packet: Packet(my_packet), packet: Packet(my_packet),
}) }))
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册