mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-22 11:53:44 +00:00
Don't hold the active queries lock while calling make_query
This commit is contained in:
parent
ad8304a0d5
commit
fd3d2d49f2
@ -69,6 +69,8 @@ where
|
||||
make_query: fn(Qcx, K) -> QueryStackFrame<D>,
|
||||
jobs: &mut QueryMap<D>,
|
||||
) -> Option<()> {
|
||||
let mut active = Vec::new();
|
||||
|
||||
#[cfg(parallel_compiler)]
|
||||
{
|
||||
// We use try_lock_shards here since we are called from the
|
||||
@ -77,8 +79,7 @@ where
|
||||
for shard in shards.iter() {
|
||||
for (k, v) in shard.iter() {
|
||||
if let QueryResult::Started(ref job) = *v {
|
||||
let query = make_query(qcx, *k);
|
||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
||||
active.push((*k, job.clone()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -91,12 +92,18 @@ where
|
||||
// really hurt much.)
|
||||
for (k, v) in self.active.try_lock()?.iter() {
|
||||
if let QueryResult::Started(ref job) = *v {
|
||||
let query = make_query(qcx, *k);
|
||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
||||
active.push((*k, job.clone()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Call `make_query` while we're not holding a `self.active` lock as `make_query` may call
|
||||
// queries leading to a deadlock.
|
||||
for (key, job) in active {
|
||||
let query = make_query(qcx, key);
|
||||
jobs.insert(job.id, QueryJobInfo { query, job });
|
||||
}
|
||||
|
||||
Some(())
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user