//! manage the caches, and so forth.
use crate::{on_disk_cache, Queries};
-use rustc_middle::dep_graph::{DepKind, DepNodeIndex, SerializedDepNodeIndex};
+use rustc_middle::dep_graph::{DepNodeIndex, SerializedDepNodeIndex};
use rustc_middle::ty::tls::{self, ImplicitCtxt};
use rustc_middle::ty::TyCtxt;
use rustc_query_system::dep_graph::HasDepContext;
use rustc_serialize::opaque;
use std::any::Any;
+use std::num::NonZeroU64;
#[derive(Copy, Clone)]
pub struct QueryCtxt<'tcx> {
}
impl QueryContext for QueryCtxt<'_> {
- fn current_query_job(&self) -> Option<QueryJobId<Self::DepKind>> {
+ fn next_job_id(&self) -> QueryJobId {
+ QueryJobId(
+ NonZeroU64::new(
+ self.queries.jobs.fetch_add(1, rustc_data_structures::sync::Ordering::Relaxed),
+ )
+ .unwrap(),
+ )
+ }
+
+ fn current_query_job(&self) -> Option<QueryJobId> {
tls::with_related_context(**self, |icx| icx.query)
}
- fn try_collect_active_jobs(&self) -> Option<QueryMap<Self::DepKind>> {
+ fn try_collect_active_jobs(&self) -> Option<QueryMap> {
self.queries.try_collect_active_jobs(**self)
}
#[inline(always)]
fn start_query<R>(
&self,
- token: QueryJobId<Self::DepKind>,
+ token: QueryJobId,
diagnostics: Option<&Lock<ThinVec<Diagnostic>>>,
compute: impl FnOnce() -> R,
) -> R {
pub fn try_print_query_stack(
self,
- query: Option<QueryJobId<DepKind>>,
+ query: Option<QueryJobId>,
handler: &Handler,
num_frames: Option<usize>,
) -> usize {
}
#[allow(nonstandard_style)]
- pub mod queries {
+ mod queries {
use std::marker::PhantomData;
$(pub struct $name<$tcx> {
type Cache = query_storage::$name<$tcx>;
#[inline(always)]
- fn query_state<'a>(tcx: QueryCtxt<$tcx>) -> &'a QueryState<crate::dep_graph::DepKind, Self::Key>
+ fn query_state<'a>(tcx: QueryCtxt<$tcx>) -> &'a QueryState<Self::Key>
where QueryCtxt<$tcx>: 'a
{
&tcx.queries.$name
})*
#[allow(nonstandard_style)]
- pub mod query_callbacks {
+ mod query_callbacks {
use super::*;
use rustc_middle::dep_graph::DepNode;
use rustc_middle::ty::query::query_keys;
}
}
- $(pub fn $name()-> DepKindStruct {
+ $(pub(crate) fn $name()-> DepKindStruct {
let is_anon = is_anon!([$($modifiers)*]);
let is_eval_always = is_eval_always!([$($modifiers)*]);
pub on_disk_cache: Option<OnDiskCache<$tcx>>,
- $($(#[$attr])* $name: QueryState<
- crate::dep_graph::DepKind,
- query_keys::$name<$tcx>,
- >,)*
+ jobs: AtomicU64,
+
+ $($(#[$attr])* $name: QueryState<query_keys::$name<$tcx>>,)*
}
impl<$tcx> Queries<$tcx> {
local_providers: Box::new(local_providers),
extern_providers: Box::new(extern_providers),
on_disk_cache,
+ jobs: AtomicU64::new(1),
$($name: Default::default()),*
}
}
pub(crate) fn try_collect_active_jobs(
&$tcx self,
tcx: TyCtxt<$tcx>,
- ) -> Option<QueryMap<crate::dep_graph::DepKind>> {
+ ) -> Option<QueryMap> {
let tcx = QueryCtxt { tcx, queries: self };
let mut jobs = QueryMap::default();
$(
self.$name.try_collect_active_jobs(
tcx,
- dep_graph::DepKind::$name,
make_query::$name,
&mut jobs,
)?;