Make query keys Copy
This commit is contained in:
parent
f4f5fc3e5c
commit
056c5b3b57
@ -21,7 +21,7 @@ pub trait QueryStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub trait QueryCache: QueryStorage + Sized {
|
pub trait QueryCache: QueryStorage + Sized {
|
||||||
type Key: Hash + Eq + Clone + Debug;
|
type Key: Hash + Eq + Copy + Debug;
|
||||||
|
|
||||||
/// Checks if the query is already computed and in the cache.
|
/// Checks if the query is already computed and in the cache.
|
||||||
/// It returns the shard index and a lock guard to the shard,
|
/// It returns the shard index and a lock guard to the shard,
|
||||||
@ -61,7 +61,7 @@ impl<K: Eq + Hash, V: Copy + Debug> QueryStorage for DefaultCache<K, V> {
|
|||||||
|
|
||||||
impl<K, V> QueryCache for DefaultCache<K, V>
|
impl<K, V> QueryCache for DefaultCache<K, V>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone + Debug,
|
K: Eq + Hash + Copy + Debug,
|
||||||
V: Copy + Debug,
|
V: Copy + Debug,
|
||||||
{
|
{
|
||||||
type Key = K;
|
type Key = K;
|
||||||
@ -179,7 +179,7 @@ impl<K: Eq + Idx, V: Copy + Debug> QueryStorage for VecCache<K, V> {
|
|||||||
|
|
||||||
impl<K, V> QueryCache for VecCache<K, V>
|
impl<K, V> QueryCache for VecCache<K, V>
|
||||||
where
|
where
|
||||||
K: Eq + Idx + Clone + Debug,
|
K: Eq + Idx + Copy + Debug,
|
||||||
V: Copy + Debug,
|
V: Copy + Debug,
|
||||||
{
|
{
|
||||||
type Key = K;
|
type Key = K;
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
pub trait QueryConfig<Qcx: QueryContext> {
|
pub trait QueryConfig<Qcx: QueryContext> {
|
||||||
const NAME: &'static str;
|
const NAME: &'static str;
|
||||||
|
|
||||||
type Key: DepNodeParams<Qcx::DepContext> + Eq + Hash + Clone + Debug;
|
// `Key` and `Value` are `Copy` instead of `Clone` to ensure copying them stays cheap,
|
||||||
|
// but it isn't necessary.
|
||||||
|
type Key: DepNodeParams<Qcx::DepContext> + Eq + Hash + Copy + Debug;
|
||||||
type Value: Debug + Copy;
|
type Value: Debug + Copy;
|
||||||
|
|
||||||
type Cache: QueryCache<Key = Self::Key, Value = Self::Value>;
|
type Cache: QueryCache<Key = Self::Key, Value = Self::Value>;
|
||||||
|
@ -49,7 +49,7 @@ enum QueryResult<D: DepKind> {
|
|||||||
|
|
||||||
impl<K, D> QueryState<K, D>
|
impl<K, D> QueryState<K, D>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone + Debug,
|
K: Eq + Hash + Copy + Debug,
|
||||||
D: DepKind,
|
D: DepKind,
|
||||||
{
|
{
|
||||||
pub fn all_inactive(&self) -> bool {
|
pub fn all_inactive(&self) -> bool {
|
||||||
@ -78,7 +78,7 @@ pub fn try_collect_active_jobs<Qcx: Copy>(
|
|||||||
for shard in shards.iter() {
|
for shard in shards.iter() {
|
||||||
for (k, v) in shard.iter() {
|
for (k, v) in shard.iter() {
|
||||||
if let QueryResult::Started(ref job) = *v {
|
if let QueryResult::Started(ref job) = *v {
|
||||||
let query = make_query(qcx, k.clone());
|
let query = make_query(qcx, *k);
|
||||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,7 +92,7 @@ pub fn try_collect_active_jobs<Qcx: Copy>(
|
|||||||
// really hurt much.)
|
// really hurt much.)
|
||||||
for (k, v) in self.active.try_lock()?.iter() {
|
for (k, v) in self.active.try_lock()?.iter() {
|
||||||
if let QueryResult::Started(ref job) = *v {
|
if let QueryResult::Started(ref job) = *v {
|
||||||
let query = make_query(qcx, k.clone());
|
let query = make_query(qcx, *k);
|
||||||
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
jobs.insert(job.id, QueryJobInfo { query, job: job.clone() });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -112,7 +112,7 @@ fn default() -> QueryState<K, D> {
|
|||||||
/// This will poison the relevant query if dropped.
|
/// This will poison the relevant query if dropped.
|
||||||
struct JobOwner<'tcx, K, D: DepKind>
|
struct JobOwner<'tcx, K, D: DepKind>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone,
|
K: Eq + Hash + Copy,
|
||||||
{
|
{
|
||||||
state: &'tcx QueryState<K, D>,
|
state: &'tcx QueryState<K, D>,
|
||||||
key: K,
|
key: K,
|
||||||
@ -164,7 +164,7 @@ fn handle_cycle_error<Tcx, V>(
|
|||||||
|
|
||||||
impl<'tcx, K, D: DepKind> JobOwner<'tcx, K, D>
|
impl<'tcx, K, D: DepKind> JobOwner<'tcx, K, D>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone,
|
K: Eq + Hash + Copy,
|
||||||
{
|
{
|
||||||
/// Either gets a `JobOwner` corresponding the query, allowing us to
|
/// Either gets a `JobOwner` corresponding the query, allowing us to
|
||||||
/// start executing the query, or returns with the result of the query.
|
/// start executing the query, or returns with the result of the query.
|
||||||
@ -196,7 +196,7 @@ fn try_start<'b, Qcx>(
|
|||||||
let job = qcx.current_query_job();
|
let job = qcx.current_query_job();
|
||||||
let job = QueryJob::new(id, span, job);
|
let job = QueryJob::new(id, span, job);
|
||||||
|
|
||||||
let key = entry.key().clone();
|
let key = *entry.key();
|
||||||
entry.insert(QueryResult::Started(job));
|
entry.insert(QueryResult::Started(job));
|
||||||
|
|
||||||
let owner = JobOwner { state, id, key };
|
let owner = JobOwner { state, id, key };
|
||||||
@ -275,7 +275,7 @@ fn complete<C>(self, cache: &C, result: C::Value, dep_node_index: DepNodeIndex)
|
|||||||
|
|
||||||
impl<'tcx, K, D> Drop for JobOwner<'tcx, K, D>
|
impl<'tcx, K, D> Drop for JobOwner<'tcx, K, D>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone,
|
K: Eq + Hash + Copy,
|
||||||
D: DepKind,
|
D: DepKind,
|
||||||
{
|
{
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
@ -292,7 +292,7 @@ fn drop(&mut self) {
|
|||||||
QueryResult::Started(job) => job,
|
QueryResult::Started(job) => job,
|
||||||
QueryResult::Poisoned => panic!(),
|
QueryResult::Poisoned => panic!(),
|
||||||
};
|
};
|
||||||
shard.insert(self.key.clone(), QueryResult::Poisoned);
|
shard.insert(self.key, QueryResult::Poisoned);
|
||||||
job
|
job
|
||||||
};
|
};
|
||||||
// Also signal the completion of the job, so waiters
|
// Also signal the completion of the job, so waiters
|
||||||
@ -311,7 +311,7 @@ pub(crate) struct CycleError<D: DepKind> {
|
|||||||
/// The result of `try_start`.
|
/// The result of `try_start`.
|
||||||
enum TryGetJob<'tcx, K, D>
|
enum TryGetJob<'tcx, K, D>
|
||||||
where
|
where
|
||||||
K: Eq + Hash + Clone,
|
K: Eq + Hash + Copy,
|
||||||
D: DepKind,
|
D: DepKind,
|
||||||
{
|
{
|
||||||
/// The query is not yet started. Contains a guard to the cache eventually used to start it.
|
/// The query is not yet started. Contains a guard to the cache eventually used to start it.
|
||||||
@ -359,10 +359,9 @@ fn try_execute_query<Q, Qcx>(
|
|||||||
Q: QueryConfig<Qcx>,
|
Q: QueryConfig<Qcx>,
|
||||||
Qcx: QueryContext,
|
Qcx: QueryContext,
|
||||||
{
|
{
|
||||||
match JobOwner::<'_, Q::Key, Qcx::DepKind>::try_start(&qcx, state, span, key.clone()) {
|
match JobOwner::<'_, Q::Key, Qcx::DepKind>::try_start(&qcx, state, span, key) {
|
||||||
TryGetJob::NotYetStarted(job) => {
|
TryGetJob::NotYetStarted(job) => {
|
||||||
let (result, dep_node_index) =
|
let (result, dep_node_index) = execute_job::<Q, Qcx>(qcx, key, dep_node, job.id);
|
||||||
execute_job::<Q, Qcx>(qcx, key.clone(), dep_node, job.id);
|
|
||||||
if Q::FEEDABLE {
|
if Q::FEEDABLE {
|
||||||
// We may have put a value inside the cache from inside the execution.
|
// We may have put a value inside the cache from inside the execution.
|
||||||
// Verify that it has the same hash as what we have now, to ensure consistency.
|
// Verify that it has the same hash as what we have now, to ensure consistency.
|
||||||
@ -547,7 +546,7 @@ fn try_load_from_disk_and_cache_in_memory<Q, Qcx>(
|
|||||||
let prof_timer = qcx.dep_context().profiler().query_provider();
|
let prof_timer = qcx.dep_context().profiler().query_provider();
|
||||||
|
|
||||||
// The dep-graph for this computation is already in-place.
|
// The dep-graph for this computation is already in-place.
|
||||||
let result = dep_graph.with_ignore(|| Q::compute(qcx, key.clone()));
|
let result = dep_graph.with_ignore(|| Q::compute(qcx, *key));
|
||||||
|
|
||||||
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
|
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user