about summary refs log tree commit diff
path: root/src/libstd/thread
diff options
context:
space:
mode:
authoroliver-giersch <oliver.giersch@googlemail.com>2018-10-13 14:34:31 +0200
committerGitHub <noreply@github.com>2018-10-13 14:34:31 +0200
commitfbb95689d692ba456309927793a28da85d2bf4d1 (patch)
tree15e32a661e8049f3099c9675c5bea1881b09c30f /src/libstd/thread
parent2d81989974a134025be733115574bee8084095b4 (diff)
downloadrust-fbb95689d692ba456309927793a28da85d2bf4d1.tar.gz
rust-fbb95689d692ba456309927793a28da85d2bf4d1.zip
adds unsafe `thread::Builder::spawn_unchecked` function
moves code for `thread::Builder::spawn` into new public unsafe function `spawn_unchecked` and transforms `spawn` into a safe wrapper.
Diffstat (limited to 'src/libstd/thread')
-rw-r--r--src/libstd/thread/mod.rs28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs
index c8d54a63946..28e69a1d065 100644
--- a/src/libstd/thread/mod.rs
+++ b/src/libstd/thread/mod.rs
@@ -387,6 +387,13 @@ 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_unchecked(f) }
+    }
+    
+    /// TODO: Doc
+    pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
+        F: FnOnce() -> T, F: Send + 'a, T: Send + 'a
+    {
         let Builder { name, stack_size } = self;
 
         let stack_size = stack_size.unwrap_or_else(thread::min_stack);
@@ -402,16 +409,15 @@ impl Builder {
             if let Some(name) = their_thread.cname() {
                 imp::Thread::set_name(name);
             }
-            unsafe {
-                thread_info::set(imp::guard::current(), their_thread);
-                #[cfg(feature = "backtrace")]
-                let try_result = panic::catch_unwind(panic::AssertUnwindSafe(|| {
-                    ::sys_common::backtrace::__rust_begin_short_backtrace(f)
-                }));
-                #[cfg(not(feature = "backtrace"))]
-                let try_result = panic::catch_unwind(panic::AssertUnwindSafe(f));
-                *their_packet.get() = Some(try_result);
-            }
+
+            thread_info::set(imp::guard::current(), their_thread);
+            #[cfg(feature = "backtrace")]
+            let try_result = panic::catch_unwind(panic::AssertUnwindSafe(|| {
+                ::sys_common::backtrace::__rust_begin_short_backtrace(f)
+            }));
+            #[cfg(not(feature = "backtrace"))]
+            let try_result = panic::catch_unwind(panic::AssertUnwindSafe(f));
+            *their_packet.get() = Some(try_result);
         };
 
         Ok(JoinHandle(JoinInner {
@@ -420,7 +426,7 @@ impl Builder {
             },
             thread: my_thread,
             packet: Packet(my_packet),
-        }))
+        }))   
     }
 }