Prevent double panic in query system, improve diagnostics

This commit is contained in:
Felix Rath 2024-08-12 03:16:39 +02:00
parent e3f909b2bb
commit 2bf2455925
2 changed files with 17 additions and 4 deletions

View File

@ -702,11 +702,17 @@ macro_rules! define_queries {
let name = stringify!($name); let name = stringify!($name);
$crate::plumbing::create_query_frame(tcx, rustc_middle::query::descs::$name, key, kind, name) $crate::plumbing::create_query_frame(tcx, rustc_middle::query::descs::$name, key, kind, name)
}; };
tcx.query_system.states.$name.try_collect_active_jobs( let res = tcx.query_system.states.$name.try_collect_active_jobs(
tcx, tcx,
make_query, make_query,
qmap, qmap,
).unwrap(); );
// this can be called during unwinding, and the function has a `try_`-prefix, so
// don't `unwrap()` here, just manually check for `None` and do best-effort error
// reporting.
if res.is_none() {
tracing::warn!("Failed to collect active jobs for query with name `{}`!", stringify!($name));
}
} }
pub fn alloc_self_profile_query_strings<'tcx>(tcx: TyCtxt<'tcx>, string_cache: &mut QueryKeyStringCache) { pub fn alloc_self_profile_query_strings<'tcx>(tcx: TyCtxt<'tcx>, string_cache: &mut QueryKeyStringCache) {

View File

@ -181,8 +181,15 @@ where
cache.complete(key, result, dep_node_index); cache.complete(key, result, dep_node_index);
let job = { let job = {
let mut lock = state.active.lock_shard_by_value(&key); let val = {
lock.remove(&key).unwrap().expect_job() // don't keep the lock during the `unwrap()` of the retrieved value, or we taint the
// underlying shard.
// since unwinding also wants to look at this map, this can also prevent a double
// panic.
let mut lock = state.active.lock_shard_by_value(&key);
lock.remove(&key)
};
val.unwrap().expect_job()
}; };
job.signal_complete(); job.signal_complete();