@@ -401,16 +401,34 @@ fn try_execute_query<CTX, C>(
401
401
span : Span ,
402
402
key : C :: Key ,
403
403
lookup : QueryLookup < ' _ , CTX :: DepKind , CTX :: Query , C :: Key , C :: Sharded > ,
404
+ caller : & QueryCaller < CTX :: DepKind > ,
404
405
query : & QueryVtable < CTX , C :: Key , C :: Value > ,
405
406
) -> C :: Stored
406
407
where
407
408
C : QueryCache ,
408
409
C :: Key : crate :: dep_graph:: DepNodeParams < CTX > ,
409
410
CTX : QueryContext ,
410
411
{
411
- let job = match JobOwner :: < ' _ , CTX :: DepKind , CTX :: Query , C > :: try_start (
412
+ let job = JobOwner :: < ' _ , CTX :: DepKind , CTX :: Query , C > :: try_start (
412
413
tcx, state, span, & key, lookup, query,
413
- ) {
414
+ ) ;
415
+
416
+ if let QueryCaller :: Force ( dep_node) = caller {
417
+ // We may be concurrently trying both execute and force a query.
418
+ // Ensure that only one of them runs the query.
419
+
420
+ let job = match job {
421
+ TryGetJob :: NotYetStarted ( job) => job,
422
+ TryGetJob :: Cycle ( result) => return result,
423
+ #[ cfg( parallel_compiler) ]
424
+ TryGetJob :: JobCompleted ( ( v, _) ) => {
425
+ return v;
426
+ }
427
+ } ;
428
+ return force_query_with_job ( tcx, key, job, * dep_node, query) . 0 ;
429
+ } ;
430
+
431
+ let job = match job {
414
432
TryGetJob :: NotYetStarted ( job) => job,
415
433
TryGetJob :: Cycle ( result) => return result,
416
434
#[ cfg( parallel_compiler) ]
@@ -710,31 +728,7 @@ where
710
728
}
711
729
}
712
730
} ,
713
- |key, lookup| {
714
- match & caller {
715
- QueryCaller :: Ensure => {
716
- try_execute_query ( tcx, state, span, key, lookup, query) ;
717
- None
718
- }
719
- QueryCaller :: Get => {
720
- let value = try_execute_query ( tcx, state, span, key, lookup, query) ;
721
- Some ( value)
722
- }
723
- QueryCaller :: Force ( dep_node) => {
724
- // We may be concurrently trying both execute and force a query.
725
- // Ensure that only one of them runs the query.
726
-
727
- let job = match JobOwner :: try_start ( tcx, state, span, & key, lookup, query) {
728
- TryGetJob :: NotYetStarted ( job) => job,
729
- TryGetJob :: Cycle ( _) => return None ,
730
- #[ cfg( parallel_compiler) ]
731
- TryGetJob :: JobCompleted ( _) => return None ,
732
- } ;
733
- force_query_with_job ( tcx, key, job, * dep_node, query) ;
734
- None
735
- }
736
- }
737
- } ,
731
+ |key, lookup| Some ( try_execute_query ( tcx, state, span, key, lookup, & caller, query) ) ,
738
732
)
739
733
}
740
734
0 commit comments