@@ -396,63 +396,29 @@ where
396
396
}
397
397
398
398
#[ inline( always) ]
399
- fn try_execute_query < CTX , C > (
399
+ fn try_execute_query < CTX , K , V > (
400
400
tcx : CTX ,
401
- state : & QueryState < CTX :: DepKind , CTX :: Query , C > ,
402
- span : Span ,
403
- key : C :: Key ,
404
- lookup : QueryLookup < ' _ , CTX :: DepKind , CTX :: Query , C :: Key , C :: Sharded > ,
405
- caller : & QueryCaller < CTX :: DepKind > ,
406
- query : & QueryVtable < CTX , C :: Key , C :: Value > ,
407
- ) -> C :: Stored
401
+ job_id : QueryJobId < CTX :: DepKind > ,
402
+ key : K ,
403
+ query : & QueryVtable < CTX , K , V > ,
404
+ ) -> ( V , DepNodeIndex , bool )
408
405
where
409
- C : QueryCache ,
410
- C :: Key : crate :: dep_graph:: DepNodeParams < CTX > ,
406
+ K : Eq + Clone + Debug + crate :: dep_graph:: DepNodeParams < CTX > ,
411
407
CTX : QueryContext ,
412
408
{
413
- let job = JobOwner :: < ' _ , CTX :: DepKind , CTX :: Query , C > :: try_start (
414
- tcx, state, span, & key, lookup, query,
415
- ) ;
416
-
417
- if let QueryCaller :: Force ( dep_node) = caller {
418
- // We may be concurrently trying both execute and force a query.
419
- // Ensure that only one of them runs the query.
420
-
421
- let job = match job {
422
- TryGetJob :: NotYetStarted ( job) => job,
423
- TryGetJob :: Cycle ( result) => return result,
424
- #[ cfg( parallel_compiler) ]
425
- TryGetJob :: JobCompleted ( ( v, _) ) => {
426
- return v;
427
- }
428
- } ;
429
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
430
- return job. complete ( result, dep_node_index) ;
431
- } ;
432
-
433
- let job = match job {
434
- TryGetJob :: NotYetStarted ( job) => job,
435
- TryGetJob :: Cycle ( result) => return result,
436
- #[ cfg( parallel_compiler) ]
437
- TryGetJob :: JobCompleted ( ( v, index) ) => {
438
- tcx. dep_graph ( ) . read_index ( index) ;
439
- return v;
440
- }
441
- } ;
442
-
443
409
// Fast path for when incr. comp. is off. `to_dep_node` is
444
410
// expensive for some `DepKind`s.
445
411
if !tcx. dep_graph ( ) . is_fully_enabled ( ) {
446
412
let null_dep_node = DepNode :: new_no_params ( DepKind :: NULL ) ;
447
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job . id , null_dep_node, query) ;
448
- return job . complete ( result, dep_node_index) ;
413
+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id , null_dep_node, query) ;
414
+ return ( result, dep_node_index, false ) ;
449
415
}
450
416
451
417
if query. anon {
452
418
let prof_timer = tcx. profiler ( ) . query_provider ( ) ;
453
419
454
420
let ( ( result, dep_node_index) , diagnostics) = with_diagnostics ( |diagnostics| {
455
- tcx. start_query ( job . id , diagnostics, |tcx| {
421
+ tcx. start_query ( job_id , diagnostics, |tcx| {
456
422
tcx. dep_graph ( ) . with_anon_task ( query. dep_kind , || query. compute ( tcx, key) )
457
423
} )
458
424
} ) ;
@@ -465,7 +431,7 @@ where
465
431
tcx. store_diagnostics_for_anon_node ( dep_node_index, diagnostics) ;
466
432
}
467
433
468
- return job . complete ( result, dep_node_index) ;
434
+ return ( result, dep_node_index, false ) ;
469
435
}
470
436
471
437
let dep_node = query. to_dep_node ( tcx, & key) ;
@@ -474,7 +440,7 @@ where
474
440
// The diagnostics for this query will be
475
441
// promoted to the current session during
476
442
// `try_mark_green()`, so we can ignore them here.
477
- let loaded = tcx. start_query ( job . id , None , |tcx| {
443
+ let loaded = tcx. start_query ( job_id , None , |tcx| {
478
444
let marked = tcx. dep_graph ( ) . try_mark_green_and_read ( tcx, & dep_node) ;
479
445
marked. map ( |( prev_dep_node_index, dep_node_index) | {
480
446
(
@@ -491,14 +457,12 @@ where
491
457
} )
492
458
} ) ;
493
459
if let Some ( ( result, dep_node_index) ) = loaded {
494
- return job . complete ( result, dep_node_index) ;
460
+ return ( result, dep_node_index, false ) ;
495
461
}
496
462
}
497
463
498
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , dep_node, query) ;
499
- let result = job. complete ( result, dep_node_index) ;
500
- tcx. dep_graph ( ) . read_index ( dep_node_index) ;
501
- result
464
+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id, dep_node, query) ;
465
+ return ( result, dep_node_index, true ) ;
502
466
}
503
467
504
468
fn load_from_disk_and_cache_in_memory < CTX , K , V > (
@@ -730,7 +694,43 @@ where
730
694
}
731
695
}
732
696
} ,
733
- |key, lookup| Some ( try_execute_query ( tcx, state, span, key, lookup, & caller, query) ) ,
697
+ |key, lookup| {
698
+ let job = JobOwner :: try_start ( tcx, state, span, & key, lookup, query) ;
699
+
700
+ if let QueryCaller :: Force ( dep_node) = & caller {
701
+ // We may be concurrently trying both execute and force a query.
702
+ // Ensure that only one of them runs the query.
703
+
704
+ let job = match job {
705
+ TryGetJob :: NotYetStarted ( job) => job,
706
+ TryGetJob :: Cycle ( _) => return None ,
707
+ #[ cfg( parallel_compiler) ]
708
+ TryGetJob :: JobCompleted ( _) => {
709
+ return None ;
710
+ }
711
+ } ;
712
+ let ( result, dep_node_index) =
713
+ force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
714
+ return Some ( job. complete ( result, dep_node_index) ) ;
715
+ } ;
716
+
717
+ let job = match job {
718
+ TryGetJob :: NotYetStarted ( job) => job,
719
+ TryGetJob :: Cycle ( result) => return Some ( result) ,
720
+ #[ cfg( parallel_compiler) ]
721
+ TryGetJob :: JobCompleted ( ( v, index) ) => {
722
+ tcx. dep_graph ( ) . read_index ( index) ;
723
+ return Some ( v) ;
724
+ }
725
+ } ;
726
+
727
+ let ( result, dep_node_index, read_index) = try_execute_query ( tcx, job. id , key, query) ;
728
+ if read_index {
729
+ tcx. dep_graph ( ) . read_index ( dep_node_index) ;
730
+ }
731
+ let result = job. complete ( result, dep_node_index) ;
732
+ Some ( result)
733
+ } ,
734
734
)
735
735
}
736
736
0 commit comments