get rid of tcx
in deadlock handler when parallel compilation
This commit is contained in:
parent
3b0d4813ab
commit
fbca21edd2
4 changed files with 9 additions and 21 deletions
|
@ -10,7 +10,7 @@ use rustc_errors::registry::Registry;
|
||||||
use rustc_middle::ty::tls;
|
use rustc_middle::ty::tls;
|
||||||
use rustc_parse::validate_attr;
|
use rustc_parse::validate_attr;
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
use rustc_query_impl::QueryCtxt;
|
use rustc_query_impl::{QueryContext, QueryCtxt};
|
||||||
use rustc_session as session;
|
use rustc_session as session;
|
||||||
use rustc_session::config::CheckCfg;
|
use rustc_session::config::CheckCfg;
|
||||||
use rustc_session::config::{self, CrateType};
|
use rustc_session::config::{self, CrateType};
|
||||||
|
@ -166,20 +166,12 @@ pub fn run_in_thread_pool_with_globals<F: FnOnce() -> R + Send, R: Send>(
|
||||||
unsafe fn handle_deadlock() {
|
unsafe fn handle_deadlock() {
|
||||||
let registry = rustc_rayon_core::Registry::current();
|
let registry = rustc_rayon_core::Registry::current();
|
||||||
|
|
||||||
let context = tls::get_tlv();
|
let query_map = tls::with(|tcx| {
|
||||||
assert!(context != 0);
|
QueryCtxt::from_tcx(tcx)
|
||||||
rustc_data_structures::sync::assert_sync::<tls::ImplicitCtxt<'_, '_>>();
|
.try_collect_active_jobs()
|
||||||
let icx: &tls::ImplicitCtxt<'_, '_> = &*(context as *const tls::ImplicitCtxt<'_, '_>);
|
.expect("active jobs shouldn't be locked in deadlock handler")
|
||||||
|
|
||||||
let session_globals = rustc_span::with_session_globals(|sg| sg as *const _);
|
|
||||||
let session_globals = &*session_globals;
|
|
||||||
thread::spawn(move || {
|
|
||||||
tls::enter_context(icx, |_| {
|
|
||||||
rustc_span::set_session_globals_then(session_globals, || {
|
|
||||||
tls::with(|tcx| QueryCtxt::from_tcx(tcx).deadlock(®istry))
|
|
||||||
})
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
thread::spawn(move || rustc_query_impl::deadlock(query_map, ®istry));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
|
|
|
@ -27,6 +27,8 @@ use rustc_span::Span;
|
||||||
mod plumbing;
|
mod plumbing;
|
||||||
pub use plumbing::QueryCtxt;
|
pub use plumbing::QueryCtxt;
|
||||||
use rustc_query_system::query::*;
|
use rustc_query_system::query::*;
|
||||||
|
#[cfg(parallel_compiler)]
|
||||||
|
pub use rustc_query_system::query::{deadlock, QueryContext};
|
||||||
|
|
||||||
mod keys;
|
mod keys;
|
||||||
use keys::Key;
|
use keys::Key;
|
||||||
|
|
|
@ -132,11 +132,6 @@ impl<'tcx> QueryCtxt<'tcx> {
|
||||||
self.queries.on_disk_cache.as_ref()
|
self.queries.on_disk_cache.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(parallel_compiler)]
|
|
||||||
pub unsafe fn deadlock(self, registry: &rustc_rayon_core::Registry) {
|
|
||||||
rustc_query_system::query::deadlock(self, registry)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(super) fn encode_query_results(
|
pub(super) fn encode_query_results(
|
||||||
self,
|
self,
|
||||||
encoder: &mut on_disk_cache::CacheEncoder<'_, 'tcx>,
|
encoder: &mut on_disk_cache::CacheEncoder<'_, 'tcx>,
|
||||||
|
|
|
@ -492,14 +492,13 @@ fn remove_cycle(
|
||||||
/// There may be multiple cycles involved in a deadlock, so this searches
|
/// There may be multiple cycles involved in a deadlock, so this searches
|
||||||
/// all active queries for cycles before finally resuming all the waiters at once.
|
/// all active queries for cycles before finally resuming all the waiters at once.
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
pub fn deadlock<CTX: QueryContext>(tcx: CTX, registry: &rayon_core::Registry) {
|
pub fn deadlock(query_map: QueryMap, registry: &rayon_core::Registry) {
|
||||||
let on_panic = OnDrop(|| {
|
let on_panic = OnDrop(|| {
|
||||||
eprintln!("deadlock handler panicked, aborting process");
|
eprintln!("deadlock handler panicked, aborting process");
|
||||||
process::abort();
|
process::abort();
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut wakelist = Vec::new();
|
let mut wakelist = Vec::new();
|
||||||
let query_map = tcx.try_collect_active_jobs().unwrap();
|
|
||||||
let mut jobs: Vec<QueryJobId> = query_map.keys().cloned().collect();
|
let mut jobs: Vec<QueryJobId> = query_map.keys().cloned().collect();
|
||||||
|
|
||||||
let mut found_cycle = false;
|
let mut found_cycle = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue