]> git.lizzy.rs Git - rust.git/commitdiff
Simplify scoped_thread
authorMark Rousskov <mark.simulacrum@gmail.com>
Sun, 19 Sep 2021 18:02:38 +0000 (14:02 -0400)
committerMark Rousskov <mark.simulacrum@gmail.com>
Thu, 23 Sep 2021 16:56:59 +0000 (12:56 -0400)
Avoids a bunch of manual pointer manipulation.

compiler/rustc_interface/src/lib.rs
compiler/rustc_interface/src/util.rs

index c7424b9e2a120560a39c506abd23157056f73470..2fc3759968fd3531d8c63857a98cbda411de3a00 100644 (file)
@@ -1,6 +1,7 @@
 #![feature(bool_to_option)]
 #![feature(box_patterns)]
 #![feature(internal_output_capture)]
+#![feature(thread_spawn_unchecked)]
 #![feature(nll)]
 #![feature(once_cell)]
 #![recursion_limit = "256"]
index 3d90a6c9345362d5c4875202661d8a813eeee1e5..24975702b875db76ae25c7c1bb6bc3cb365f2fc1 100644 (file)
@@ -115,25 +115,11 @@ fn get_stack_size() -> Option<usize> {
 /// for `'static` bounds.
 #[cfg(not(parallel_compiler))]
 pub fn scoped_thread<F: FnOnce() -> R + Send, R: Send>(cfg: thread::Builder, f: F) -> R {
-    struct Ptr(*mut ());
-    unsafe impl Send for Ptr {}
-    unsafe impl Sync for Ptr {}
-
-    let mut f = Some(f);
-    let run = Ptr(&mut f as *mut _ as *mut ());
-    let mut result = None;
-    let result_ptr = Ptr(&mut result as *mut _ as *mut ());
-
-    let thread = cfg.spawn(move || {
-        let _ = (&run, &result_ptr);
-        let run = unsafe { (*(run.0 as *mut Option<F>)).take().unwrap() };
-        let result = unsafe { &mut *(result_ptr.0 as *mut Option<R>) };
-        *result = Some(run());
-    });
-
-    match thread.unwrap().join() {
-        Ok(()) => result.unwrap(),
-        Err(p) => panic::resume_unwind(p),
+    // SAFETY: join() is called immediately, so any closure captures are still
+    // alive.
+    match unsafe { cfg.spawn_unchecked(f) }.unwrap().join() {
+        Ok(v) => v,
+        Err(e) => panic::resume_unwind(e),
     }
 }