mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Fix a race in the query system
This commit is contained in:
parent
b583ede652
commit
10b08e3c9c
@ -25,7 +25,6 @@ use std::collections::hash_map::Entry;
|
||||
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 @@ where
|
||||
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 @@ where
|
||||
QueryResult::Poisoned => panic!(),
|
||||
}
|
||||
};
|
||||
cache.complete(key, result, dep_node_index);
|
||||
|
||||
job.signal_complete();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user