diff options
| author | oliver-giersch <oliver.giersch@googlemail.com> | 2018-10-13 14:34:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-13 14:34:31 +0200 |
| commit | fbb95689d692ba456309927793a28da85d2bf4d1 (patch) | |
| tree | 15e32a661e8049f3099c9675c5bea1881b09c30f /src/libstd/thread | |
| parent | 2d81989974a134025be733115574bee8084095b4 (diff) | |
| download | rust-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.rs | 28 |
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), - })) + })) } } |
