Skip to content

Commit d4bf8fb

Browse files
committed
Move job creation/completion out of try_execute_query.
1 parent 7fddbde commit d4bf8fb

File tree

1 file changed

+51
-51
lines changed

1 file changed

+51
-51
lines changed

compiler/rustc_query_system/src/query/plumbing.rs

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -396,63 +396,29 @@ where
396396
}
397397

398398
#[inline(always)]
399-
fn try_execute_query<CTX, C>(
399+
fn try_execute_query<CTX, K, V>(
400400
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)
408405
where
409-
C: QueryCache,
410-
C::Key: crate::dep_graph::DepNodeParams<CTX>,
406+
K: Eq + Clone + Debug + crate::dep_graph::DepNodeParams<CTX>,
411407
CTX: QueryContext,
412408
{
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-
443409
// Fast path for when incr. comp. is off. `to_dep_node` is
444410
// expensive for some `DepKind`s.
445411
if !tcx.dep_graph().is_fully_enabled() {
446412
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);
449415
}
450416

451417
if query.anon {
452418
let prof_timer = tcx.profiler().query_provider();
453419

454420
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| {
456422
tcx.dep_graph().with_anon_task(query.dep_kind, || query.compute(tcx, key))
457423
})
458424
});
@@ -465,7 +431,7 @@ where
465431
tcx.store_diagnostics_for_anon_node(dep_node_index, diagnostics);
466432
}
467433

468-
return job.complete(result, dep_node_index);
434+
return (result, dep_node_index, false);
469435
}
470436

471437
let dep_node = query.to_dep_node(tcx, &key);
@@ -474,7 +440,7 @@ where
474440
// The diagnostics for this query will be
475441
// promoted to the current session during
476442
// `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| {
478444
let marked = tcx.dep_graph().try_mark_green_and_read(tcx, &dep_node);
479445
marked.map(|(prev_dep_node_index, dep_node_index)| {
480446
(
@@ -491,14 +457,12 @@ where
491457
})
492458
});
493459
if let Some((result, dep_node_index)) = loaded {
494-
return job.complete(result, dep_node_index);
460+
return (result, dep_node_index, false);
495461
}
496462
}
497463

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);
502466
}
503467

504468
fn load_from_disk_and_cache_in_memory<CTX, K, V>(
@@ -730,7 +694,43 @@ where
730694
}
731695
}
732696
},
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+
},
734734
)
735735
}
736736

0 commit comments

Comments
 (0)