Skip to content

Commit fd60635

Browse files
committed
Move job creation/completion out of try_execute_query.
1 parent 8e39ab6 commit fd60635

File tree

1 file changed

+51
-49
lines changed

1 file changed

+51
-49
lines changed

compiler/rustc_query_system/src/query/plumbing.rs

+51-49
Original file line numberDiff line numberDiff line change
@@ -383,61 +383,29 @@ where
383383
}
384384

385385
#[inline(always)]
386-
fn try_execute_query<CTX, C>(
386+
fn try_execute_query<CTX, K, V>(
387387
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)
395392
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>,
398394
CTX: QueryContext,
399395
{
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-
428396
// Fast path for when incr. comp. is off. `to_dep_node` is
429397
// expensive for some `DepKind`s.
430398
if !tcx.dep_graph().is_fully_enabled() {
431399
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);
434402
}
435403

436404
if query.anon {
437405
let prof_timer = tcx.profiler().query_provider();
438406

439407
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| {
441409
tcx.dep_graph().with_anon_task(query.dep_kind, || query.compute(tcx, key))
442410
})
443411
});
@@ -450,7 +418,7 @@ where
450418
tcx.store_diagnostics_for_anon_node(dep_node_index, diagnostics);
451419
}
452420

453-
return job.complete(result, dep_node_index);
421+
return (result, dep_node_index, false);
454422
}
455423

456424
let dep_node = query.to_dep_node(tcx, &key);
@@ -459,7 +427,7 @@ where
459427
// The diagnostics for this query will be
460428
// promoted to the current session during
461429
// `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| {
463431
let marked = tcx.dep_graph().try_mark_green_and_read(tcx, &dep_node);
464432
marked.map(|(prev_dep_node_index, dep_node_index)| {
465433
(
@@ -476,14 +444,12 @@ where
476444
})
477445
});
478446
if let Some((result, dep_node_index)) = loaded {
479-
return job.complete(result, dep_node_index);
447+
return (result, dep_node_index, false);
480448
}
481449
}
482450

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);
487453
}
488454

489455
fn load_from_disk_and_cache_in_memory<CTX, K, V>(
@@ -715,7 +681,43 @@ where
715681
}
716682
}
717683
},
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+
},
719721
)
720722
}
721723

0 commit comments

Comments
 (0)