Rollup merge of #108555 - Zoxc:par-fix, r=cjgillot

Fix a race in the query system

This fixes an issue where in between the `job` removal and `complete` call the query neither has a job nor a result, allowing another thread to start executing it again.

r? ``@cjgillot``
This commit is contained in:
Matthias Krüger
2023-03-01 01:20:26 +01:00
committed by GitHub
@@ -25,7 +25,6 @@
use std::fmt::Debug;
use std::hash::Hash;
use std::mem;
use std::ptr;
use thin_vec::ThinVec;
use super::QueryConfig;
@@ -250,13 +249,16 @@ fn complete<C>(self, cache: &C, result: C::Value, dep_node_index: DepNodeIndex)
where
C: QueryCache<Key = K>,
{
// We can move out of `self` here because we `mem::forget` it below
let key = unsafe { ptr::read(&self.key) };
let key = self.key;
let state = self.state;
// Forget ourself so our destructor won't poison the query
mem::forget(self);
// Mark as complete before we remove the job from the active state
// so no other thread can re-execute this query.
cache.complete(key, result, dep_node_index);
let job = {
#[cfg(parallel_compiler)]
let mut lock = state.active.get_shard_by_value(&key).lock();
@@ -267,7 +269,6 @@ fn complete<C>(self, cache: &C, result: C::Value, dep_node_index: DepNodeIndex)
QueryResult::Poisoned => panic!(),
}
};
cache.complete(key, result, dep_node_index);
job.signal_complete();
}