diff --git a/Cargo.lock b/Cargo.lock index 25039b5cbd9..3294b5e6a28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -844,15 +844,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-queue" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -dependencies = [ - "crossbeam-utils 0.6.6", -] - [[package]] name = "crossbeam-queue" version = "0.2.3" @@ -864,16 +855,6 @@ dependencies = [ "maybe-uninit", ] -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -dependencies = [ - "cfg-if 0.1.10", - "lazy_static", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -3013,7 +2994,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.2.3", + "crossbeam-queue", "crossbeam-utils 0.7.2", "lazy_static", "num_cpus", @@ -3581,9 +3562,9 @@ dependencies = [ [[package]] name = "rustc-rayon" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a" +checksum = "ed7d6a39f8bfd4421ce720918234d1e672b83824c91345b47c93746839cf1629" dependencies = [ "crossbeam-deque", "either", @@ -3592,13 +3573,13 @@ dependencies = [ [[package]] name = "rustc-rayon-core" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" +checksum = "e94187d9ea3e8c38fafdbc38acb94eafa7ce155867f6ccb13830466a0d0db8c6" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.1.2", - "crossbeam-utils 0.6.6", + "crossbeam-queue", + "crossbeam-utils 0.7.2", "lazy_static", "num_cpus", ] @@ -3661,6 +3642,7 @@ dependencies = [ name = "rustc_arena" version = "0.0.0" dependencies = [ + "rustc_data_structures", "smallvec 1.6.1", ] diff --git a/compiler/rustc_arena/Cargo.toml b/compiler/rustc_arena/Cargo.toml index f2d039c82ab..5d4d47527d3 100644 --- a/compiler/rustc_arena/Cargo.toml +++ b/compiler/rustc_arena/Cargo.toml @@ -5,4 +5,5 @@ version = "0.0.0" edition = "2018" [dependencies] +rustc_data_structures = { path = "../rustc_data_structures" } smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_arena/src/lib.rs b/compiler/rustc_arena/src/lib.rs index 721cfdd4459..a9917f50cc2 100644 --- a/compiler/rustc_arena/src/lib.rs +++ b/compiler/rustc_arena/src/lib.rs @@ -17,6 +17,7 @@ #![feature(min_specialization)] #![cfg_attr(test, feature(test))] +use rustc_data_structures::sync; use smallvec::SmallVec; use std::alloc::Layout; @@ -556,8 +557,19 @@ struct DropType { obj: *mut u8, } -unsafe fn drop_for_type(to_drop: *mut u8) { - std::ptr::drop_in_place(to_drop as *mut T) +// SAFETY: we require `T: Send` before type-erasing into `DropType`. +#[cfg(parallel_compiler)] +unsafe impl sync::Send for DropType {} + +impl DropType { + #[inline] + unsafe fn new(obj: *mut T) -> Self { + unsafe fn drop_for_type(to_drop: *mut u8) { + std::ptr::drop_in_place(to_drop as *mut T) + } + + DropType { drop_fn: drop_for_type::, obj: obj as *mut u8 } + } } impl Drop for DropType { @@ -585,21 +597,26 @@ pub struct DropArena { impl DropArena { #[inline] - pub unsafe fn alloc(&self, object: T) -> &mut T { + pub unsafe fn alloc(&self, object: T) -> &mut T + where + T: sync::Send, + { let mem = self.arena.alloc_raw(Layout::new::()) as *mut T; // Write into uninitialized memory. ptr::write(mem, object); let result = &mut *mem; // Record the destructor after doing the allocation as that may panic // and would cause `object`'s destructor to run twice if it was recorded before. - self.destructors - .borrow_mut() - .push(DropType { drop_fn: drop_for_type::, obj: result as *mut T as *mut u8 }); + self.destructors.borrow_mut().push(DropType::new(result)); result } #[inline] - pub unsafe fn alloc_from_iter>(&self, iter: I) -> &mut [T] { + pub unsafe fn alloc_from_iter(&self, iter: I) -> &mut [T] + where + T: sync::Send, + I: IntoIterator, + { let mut vec: SmallVec<[_; 8]> = iter.into_iter().collect(); if vec.is_empty() { return &mut []; @@ -620,8 +637,7 @@ impl DropArena { // Record the destructors after doing the allocation as that may panic // and would cause `object`'s destructor to run twice if it was recorded before. for i in 0..len { - destructors - .push(DropType { drop_fn: drop_for_type::, obj: start_ptr.add(i) as *mut u8 }); + destructors.push(DropType::new(start_ptr.add(i))); } slice::from_raw_parts_mut(start_ptr, len) diff --git a/compiler/rustc_data_structures/Cargo.toml b/compiler/rustc_data_structures/Cargo.toml index 818c4364256..2e5a86b14c9 100644 --- a/compiler/rustc_data_structures/Cargo.toml +++ b/compiler/rustc_data_structures/Cargo.toml @@ -19,8 +19,8 @@ rustc_graphviz = { path = "../rustc_graphviz" } cfg-if = "0.1.2" crossbeam-utils = { version = "0.7", features = ["nightly"] } stable_deref_trait = "1.0.0" -rayon = { version = "0.3.0", package = "rustc-rayon" } -rayon-core = { version = "0.3.0", package = "rustc-rayon-core" } +rayon = { version = "0.3.1", package = "rustc-rayon" } +rayon-core = { version = "0.3.1", package = "rustc-rayon-core" } rustc-hash = "1.1.0" smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_index = { path = "../rustc_index", package = "rustc_index" } diff --git a/compiler/rustc_interface/Cargo.toml b/compiler/rustc_interface/Cargo.toml index cfe98a630c1..3bfe8da505f 100644 --- a/compiler/rustc_interface/Cargo.toml +++ b/compiler/rustc_interface/Cargo.toml @@ -10,8 +10,8 @@ doctest = false [dependencies] libc = "0.2" tracing = "0.1" -rustc-rayon-core = "0.3.0" -rayon = { version = "0.3.0", package = "rustc-rayon" } +rustc-rayon-core = "0.3.1" +rayon = { version = "0.3.1", package = "rustc-rayon" } smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_attr = { path = "../rustc_attr" } diff --git a/compiler/rustc_middle/Cargo.toml b/compiler/rustc_middle/Cargo.toml index 06742331655..8cb30e72f79 100644 --- a/compiler/rustc_middle/Cargo.toml +++ b/compiler/rustc_middle/Cargo.toml @@ -11,7 +11,7 @@ doctest = false rustc_arena = { path = "../rustc_arena" } bitflags = "1.2.1" tracing = "0.1" -rustc-rayon-core = "0.3.0" +rustc-rayon-core = "0.3.1" polonius-engine = "0.12.0" rustc_apfloat = { path = "../rustc_apfloat" } rustc_attr = { path = "../rustc_attr" } diff --git a/compiler/rustc_query_impl/Cargo.toml b/compiler/rustc_query_impl/Cargo.toml index c88b766a55a..383e30ca29f 100644 --- a/compiler/rustc_query_impl/Cargo.toml +++ b/compiler/rustc_query_impl/Cargo.toml @@ -9,7 +9,7 @@ doctest = false [dependencies] measureme = "9.0.0" -rustc-rayon-core = "0.3.0" +rustc-rayon-core = "0.3.1" tracing = "0.1" rustc_ast = { path = "../rustc_ast" } rustc_attr = { path = "../rustc_attr" } diff --git a/compiler/rustc_query_system/Cargo.toml b/compiler/rustc_query_system/Cargo.toml index 7d3357f8fa2..19512dc1f64 100644 --- a/compiler/rustc_query_system/Cargo.toml +++ b/compiler/rustc_query_system/Cargo.toml @@ -10,7 +10,7 @@ doctest = false [dependencies] rustc_arena = { path = "../rustc_arena" } tracing = "0.1" -rustc-rayon-core = "0.3.0" +rustc-rayon-core = "0.3.1" rustc_data_structures = { path = "../rustc_data_structures" } rustc_errors = { path = "../rustc_errors" } rustc_macros = { path = "../rustc_macros" }