@@ -16,12 +16,11 @@ use dep_graph::{DepNodeIndex, DepNode, DepKind, DepNodeColor};
1616use errors:: DiagnosticBuilder ;
1717use errors:: Level ;
1818use errors:: Diagnostic ;
19- use errors:: FatalError ;
2019use ty:: tls;
2120use ty:: { TyCtxt } ;
2221use ty:: query:: Query ;
2322use ty:: query:: config:: { QueryConfig , QueryDescription } ;
24- use ty:: query:: job:: { QueryJob , QueryResult , QueryInfo } ;
23+ use ty:: query:: job:: { QueryJob , QueryInfo } ;
2524use ty:: item_path;
2625
2726use util:: common:: { profq_msg, ProfileQueriesMsg , QueryMsg } ;
@@ -35,8 +34,12 @@ use syntax_pos::Span;
3534use syntax:: source_map:: DUMMY_SP ;
3635
3736pub struct QueryCache < ' tcx , D : QueryConfig < ' tcx > + ?Sized > {
37+ /// Completed queries have their result stored here
3838 pub ( super ) results : FxHashMap < D :: Key , QueryValue < D :: Value > > ,
39- pub ( super ) active : FxHashMap < D :: Key , QueryResult < ' tcx > > ,
39+
40+ /// Queries under execution will have an entry in this map.
41+ /// The query job inside can be used to await for completion of queries.
42+ pub ( super ) active : FxHashMap < D :: Key , Lrc < QueryJob < ' tcx > > > ,
4043}
4144
4245pub ( super ) struct QueryValue < T > {
@@ -127,12 +130,7 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
127130 return TryGetJob :: JobCompleted ( result) ;
128131 }
129132 let job = match lock. active . entry ( ( * key) . clone ( ) ) {
130- Entry :: Occupied ( entry) => {
131- match * entry. get ( ) {
132- QueryResult :: Started ( ref job) => job. clone ( ) ,
133- QueryResult :: Poisoned => FatalError . raise ( ) ,
134- }
135- }
133+ Entry :: Occupied ( entry) => entry. get ( ) . clone ( ) ,
136134 Entry :: Vacant ( entry) => {
137135 // No job entry for this query. Return a new one to be started later
138136 return tls:: with_related_context ( tcx, |icx| {
@@ -149,7 +147,7 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
149147 job : job. clone ( ) ,
150148 key : ( * key) . clone ( ) ,
151149 } ;
152- entry. insert ( QueryResult :: Started ( job) ) ;
150+ entry. insert ( job) ;
153151 TryGetJob :: NotYetStarted ( owner)
154152 } )
155153 }
@@ -231,10 +229,11 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
231229
232230impl < ' a , ' tcx , Q : QueryDescription < ' tcx > > Drop for JobOwner < ' a , ' tcx , Q > {
233231 fn drop ( & mut self ) {
234- // Poison the query so jobs waiting on it panic
235- self . cache . borrow_mut ( ) . active . insert ( self . key . clone ( ) , QueryResult :: Poisoned ) ;
236- // Also signal the completion of the job, so waiters
237- // will continue execution
232+ // This job failed to execute due to a panic.
233+ // Remove it from the list of active queries
234+ self . cache . borrow_mut ( ) . active . remove ( & self . key ) ;
235+ // Signal that the job not longer executes, so the waiters will continue execution.
236+ // The waiters will try to execute the query which may result in them panicking too.
238237 self . job . signal_complete ( ) ;
239238 }
240239}
@@ -709,8 +708,6 @@ macro_rules! define_queries_inner {
709708 [ $( $modifiers: tt) * ] fn $name: ident: $node: ident( $K: ty) -> $V: ty, ) * ) => {
710709
711710 use std:: mem;
712- #[ cfg( parallel_queries) ]
713- use ty:: query:: job:: QueryResult ;
714711 use rustc_data_structures:: sync:: Lock ;
715712 use {
716713 rustc_data_structures:: stable_hasher:: HashStable ,
@@ -747,13 +744,7 @@ macro_rules! define_queries_inner {
747744 // deadlock handler, and this shouldn't be locked
748745 $(
749746 jobs. extend(
750- self . $name. try_lock( ) . unwrap( ) . active. values( ) . filter_map( |v|
751- if let QueryResult :: Started ( ref job) = * v {
752- Some ( job. clone( ) )
753- } else {
754- None
755- }
756- )
747+ self . $name. try_lock( ) . unwrap( ) . active. values( ) . cloned( )
757748 ) ;
758749 ) *
759750
0 commit comments