Rename JobOwner to ActiveJobGuard
This commit also adds and updates some relevant comments.
This commit is contained in:
parent
c6936c309a
commit
e04ae80c5a
2 changed files with 17 additions and 11 deletions
|
|
@ -16,8 +16,7 @@ pub struct ImplicitCtxt<'a, 'tcx> {
|
|||
/// The current `TyCtxt`.
|
||||
pub tcx: TyCtxt<'tcx>,
|
||||
|
||||
/// The current query job, if any. This is updated by `JobOwner::start` in
|
||||
/// `ty::query::plumbing` when executing a query.
|
||||
/// The current query job, if any.
|
||||
pub query: Option<QueryJobId>,
|
||||
|
||||
/// Used to prevent queries from calling too deeply.
|
||||
|
|
|
|||
|
|
@ -83,9 +83,12 @@ pub(crate) fn gather_active_jobs_inner<'tcx, K: Copy>(
|
|||
Some(())
|
||||
}
|
||||
|
||||
/// A type representing the responsibility to execute the job in the `job` field.
|
||||
/// This will poison the relevant query if dropped.
|
||||
struct JobOwner<'tcx, K>
|
||||
/// Guard object representing the responsibility to execute a query job and
|
||||
/// mark it as completed.
|
||||
///
|
||||
/// This will poison the relevant query key if it is dropped without calling
|
||||
/// [`Self::complete`].
|
||||
struct ActiveJobGuard<'tcx, K>
|
||||
where
|
||||
K: Eq + Hash + Copy,
|
||||
{
|
||||
|
|
@ -137,12 +140,12 @@ fn handle_cycle_error<'tcx, C: QueryCache, const FLAGS: QueryFlags>(
|
|||
}
|
||||
}
|
||||
|
||||
impl<'tcx, K> JobOwner<'tcx, K>
|
||||
impl<'tcx, K> ActiveJobGuard<'tcx, K>
|
||||
where
|
||||
K: Eq + Hash + Copy,
|
||||
{
|
||||
/// Completes the query by updating the query cache with the `result`,
|
||||
/// signals the waiter and forgets the JobOwner, so it won't poison the query
|
||||
/// signals the waiter, and forgets the guard so it won't poison the query.
|
||||
fn complete<C>(self, cache: &C, key_hash: u64, result: C::Value, dep_node_index: DepNodeIndex)
|
||||
where
|
||||
C: QueryCache<Key = K>,
|
||||
|
|
@ -174,7 +177,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<'tcx, K> Drop for JobOwner<'tcx, K>
|
||||
impl<'tcx, K> Drop for ActiveJobGuard<'tcx, K>
|
||||
where
|
||||
K: Eq + Hash + Copy,
|
||||
{
|
||||
|
|
@ -342,11 +345,13 @@ fn execute_job<'tcx, C: QueryCache, const FLAGS: QueryFlags, const INCR: bool>(
|
|||
id: QueryJobId,
|
||||
dep_node: Option<DepNode>,
|
||||
) -> (C::Value, Option<DepNodeIndex>) {
|
||||
// Use `JobOwner` so the query will be poisoned if executing it panics.
|
||||
let job_owner = JobOwner { state, key };
|
||||
// Set up a guard object that will automatically poison the query if a
|
||||
// panic occurs while executing the query (or any intermediate plumbing).
|
||||
let job_guard = ActiveJobGuard { state, key };
|
||||
|
||||
debug_assert_eq!(qcx.tcx.dep_graph.is_fully_enabled(), INCR);
|
||||
|
||||
// Delegate to another function to actually execute the query job.
|
||||
let (result, dep_node_index) = if INCR {
|
||||
execute_job_incr(query, qcx, qcx.tcx.dep_graph.data().unwrap(), key, dep_node, id)
|
||||
} else {
|
||||
|
|
@ -388,7 +393,9 @@ fn execute_job<'tcx, C: QueryCache, const FLAGS: QueryFlags, const INCR: bool>(
|
|||
}
|
||||
}
|
||||
}
|
||||
job_owner.complete(cache, key_hash, result, dep_node_index);
|
||||
|
||||
// Tell the guard to perform completion bookkeeping, and also to not poison the query.
|
||||
job_guard.complete(cache, key_hash, result, dep_node_index);
|
||||
|
||||
(result, Some(dep_node_index))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue