about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-10-19 12:45:25 +0000
committerbors <bors@rust-lang.org>2015-10-19 12:45:25 +0000
commit7aec91734e0c12b8e36158566ad512a663111c9f (patch)
treed2d3e5a0092bbf9e6f5c1f5d4cf955114e17a384 /src
parent3e268f2fbafca7e0a59bf77e17985a27c61d5a11 (diff)
parent1303687d4811e8c3e261e14adbfb9850b23ff973 (diff)
downloadrust-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.rs39
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),
-        })
+        }))
     }
 }