@@ -389,14 +389,32 @@ fn try_execute_query<CTX, C>(
389
389
span : Span ,
390
390
key : C :: Key ,
391
391
lookup : QueryLookup < ' _ , CTX , C :: Key , C :: Sharded > ,
392
+ caller : & QueryCaller < CTX :: DepKind > ,
392
393
query : & QueryVtable < CTX , C :: Key , C :: Value > ,
393
394
) -> C :: Stored
394
395
where
395
396
C : QueryCache ,
396
397
C :: Key : Eq + Clone + Debug + crate :: dep_graph:: DepNodeParams < CTX > ,
397
398
CTX : QueryContext ,
398
399
{
399
- let job = match JobOwner :: try_start ( tcx, state, span, & key, lookup, query) {
400
+ let job = JobOwner :: try_start ( tcx, state, span, & key, lookup, query) ;
401
+
402
+ if let QueryCaller :: Force ( dep_node) = caller {
403
+ // We may be concurrently trying both execute and force a query.
404
+ // Ensure that only one of them runs the query.
405
+
406
+ let job = match job {
407
+ TryGetJob :: NotYetStarted ( job) => job,
408
+ TryGetJob :: Cycle ( result) => return result,
409
+ #[ cfg( parallel_compiler) ]
410
+ TryGetJob :: JobCompleted ( ( v, _) ) => {
411
+ return v;
412
+ }
413
+ } ;
414
+ return force_query_with_job ( tcx, key, job, * dep_node, query) . 0 ;
415
+ } ;
416
+
417
+ let job = match job {
400
418
TryGetJob :: NotYetStarted ( job) => job,
401
419
TryGetJob :: Cycle ( result) => return result,
402
420
#[ cfg( parallel_compiler) ]
@@ -698,31 +716,7 @@ where
698
716
}
699
717
}
700
718
} ,
701
- |key, lookup| {
702
- match & caller {
703
- QueryCaller :: Ensure => {
704
- try_execute_query ( tcx, state, span, key, lookup, query) ;
705
- None
706
- }
707
- QueryCaller :: Get => {
708
- let value = try_execute_query ( tcx, state, span, key, lookup, query) ;
709
- Some ( value)
710
- }
711
- QueryCaller :: Force ( dep_node) => {
712
- // We may be concurrently trying both execute and force a query.
713
- // Ensure that only one of them runs the query.
714
-
715
- let job = match JobOwner :: try_start ( tcx, state, span, & key, lookup, query) {
716
- TryGetJob :: NotYetStarted ( job) => job,
717
- TryGetJob :: Cycle ( _) => return None ,
718
- #[ cfg( parallel_compiler) ]
719
- TryGetJob :: JobCompleted ( _) => return None ,
720
- } ;
721
- force_query_with_job ( tcx, key, job, * dep_node, query) ;
722
- None
723
- }
724
- }
725
- } ,
719
+ |key, lookup| Some ( try_execute_query ( tcx, state, span, key, lookup, & caller, query) ) ,
726
720
)
727
721
}
728
722
0 commit comments