@@ -383,61 +383,29 @@ where
383
383
}
384
384
385
385
#[ inline( always) ]
386
- fn try_execute_query < CTX , C > (
386
+ fn try_execute_query < CTX , K , V > (
387
387
tcx : CTX ,
388
- state : & QueryState < CTX , C > ,
389
- span : Span ,
390
- key : C :: Key ,
391
- lookup : QueryLookup < ' _ , CTX , C :: Key , C :: Sharded > ,
392
- caller : & QueryCaller < CTX :: DepKind > ,
393
- query : & QueryVtable < CTX , C :: Key , C :: Value > ,
394
- ) -> C :: Stored
388
+ job_id : QueryJobId < CTX :: DepKind > ,
389
+ key : K ,
390
+ query : & QueryVtable < CTX , K , V > ,
391
+ ) -> ( V , DepNodeIndex , bool )
395
392
where
396
- C : QueryCache ,
397
- C :: Key : Eq + Clone + Debug + crate :: dep_graph:: DepNodeParams < CTX > ,
393
+ K : Eq + Clone + Debug + crate :: dep_graph:: DepNodeParams < CTX > ,
398
394
CTX : QueryContext ,
399
395
{
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
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
415
- return job. complete ( result, dep_node_index) ;
416
- } ;
417
-
418
- let job = match job {
419
- TryGetJob :: NotYetStarted ( job) => job,
420
- TryGetJob :: Cycle ( result) => return result,
421
- #[ cfg( parallel_compiler) ]
422
- TryGetJob :: JobCompleted ( ( v, index) ) => {
423
- tcx. dep_graph ( ) . read_index ( index) ;
424
- return v;
425
- }
426
- } ;
427
-
428
396
// Fast path for when incr. comp. is off. `to_dep_node` is
429
397
// expensive for some `DepKind`s.
430
398
if !tcx. dep_graph ( ) . is_fully_enabled ( ) {
431
399
let null_dep_node = DepNode :: new_no_params ( DepKind :: NULL ) ;
432
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job . id , null_dep_node, query) ;
433
- return job . complete ( result, dep_node_index) ;
400
+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id , null_dep_node, query) ;
401
+ return ( result, dep_node_index, false ) ;
434
402
}
435
403
436
404
if query. anon {
437
405
let prof_timer = tcx. profiler ( ) . query_provider ( ) ;
438
406
439
407
let ( ( result, dep_node_index) , diagnostics) = with_diagnostics ( |diagnostics| {
440
- tcx. start_query ( job . id , diagnostics, |tcx| {
408
+ tcx. start_query ( job_id , diagnostics, |tcx| {
441
409
tcx. dep_graph ( ) . with_anon_task ( query. dep_kind , || query. compute ( tcx, key) )
442
410
} )
443
411
} ) ;
@@ -450,7 +418,7 @@ where
450
418
tcx. store_diagnostics_for_anon_node ( dep_node_index, diagnostics) ;
451
419
}
452
420
453
- return job . complete ( result, dep_node_index) ;
421
+ return ( result, dep_node_index, false ) ;
454
422
}
455
423
456
424
let dep_node = query. to_dep_node ( tcx, & key) ;
@@ -459,7 +427,7 @@ where
459
427
// The diagnostics for this query will be
460
428
// promoted to the current session during
461
429
// `try_mark_green()`, so we can ignore them here.
462
- let loaded = tcx. start_query ( job . id , None , |tcx| {
430
+ let loaded = tcx. start_query ( job_id , None , |tcx| {
463
431
let marked = tcx. dep_graph ( ) . try_mark_green_and_read ( tcx, & dep_node) ;
464
432
marked. map ( |( prev_dep_node_index, dep_node_index) | {
465
433
(
@@ -476,14 +444,12 @@ where
476
444
} )
477
445
} ) ;
478
446
if let Some ( ( result, dep_node_index) ) = loaded {
479
- return job . complete ( result, dep_node_index) ;
447
+ return ( result, dep_node_index, false ) ;
480
448
}
481
449
}
482
450
483
- let ( result, dep_node_index) = force_query_with_job ( tcx, key, job. id , dep_node, query) ;
484
- let result = job. complete ( result, dep_node_index) ;
485
- tcx. dep_graph ( ) . read_index ( dep_node_index) ;
486
- result
451
+ let ( result, dep_node_index) = force_query_with_job ( tcx, key, job_id, dep_node, query) ;
452
+ return ( result, dep_node_index, true ) ;
487
453
}
488
454
489
455
fn load_from_disk_and_cache_in_memory < CTX , K , V > (
@@ -715,7 +681,43 @@ where
715
681
}
716
682
}
717
683
} ,
718
- |key, lookup| Some ( try_execute_query ( tcx, state, span, key, lookup, & caller, query) ) ,
684
+ |key, lookup| {
685
+ let job = JobOwner :: try_start ( tcx, state, span, & key, lookup, query) ;
686
+
687
+ if let QueryCaller :: Force ( dep_node) = & caller {
688
+ // We may be concurrently trying both execute and force a query.
689
+ // Ensure that only one of them runs the query.
690
+
691
+ let job = match job {
692
+ TryGetJob :: NotYetStarted ( job) => job,
693
+ TryGetJob :: Cycle ( _) => return None ,
694
+ #[ cfg( parallel_compiler) ]
695
+ TryGetJob :: JobCompleted ( _) => {
696
+ return None ;
697
+ }
698
+ } ;
699
+ let ( result, dep_node_index) =
700
+ force_query_with_job ( tcx, key, job. id , * dep_node, query) ;
701
+ return Some ( job. complete ( result, dep_node_index) ) ;
702
+ } ;
703
+
704
+ let job = match job {
705
+ TryGetJob :: NotYetStarted ( job) => job,
706
+ TryGetJob :: Cycle ( result) => return Some ( result) ,
707
+ #[ cfg( parallel_compiler) ]
708
+ TryGetJob :: JobCompleted ( ( v, index) ) => {
709
+ tcx. dep_graph ( ) . read_index ( index) ;
710
+ return Some ( v) ;
711
+ }
712
+ } ;
713
+
714
+ let ( result, dep_node_index, read_index) = try_execute_query ( tcx, job. id , key, query) ;
715
+ if read_index {
716
+ tcx. dep_graph ( ) . read_index ( dep_node_index) ;
717
+ }
718
+ let result = job. complete ( result, dep_node_index) ;
719
+ Some ( result)
720
+ } ,
719
721
)
720
722
}
721
723
0 commit comments