mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-16 14:07:04 +00:00
Use a session counter to make anon dep nodes unique
This commit is contained in:
parent
70dab5a27c
commit
027251ff7d
@ -1167,8 +1167,7 @@ pub(super) struct CurrentDepGraph<D: Deps> {
|
||||
/// ID from the previous session. In order to side-step this problem, we make
|
||||
/// sure that anonymous `NodeId`s allocated in different sessions don't overlap.
|
||||
/// This is implemented by mixing a session-key into the ID fingerprint of
|
||||
/// each anon node. The session-key is just a random number generated when
|
||||
/// the `DepGraph` is created.
|
||||
/// each anon node. The session-key is a hash of the number of previous sessions.
|
||||
anon_id_seed: Fingerprint,
|
||||
|
||||
/// These are simple counters that are for profiling and
|
||||
@ -1186,12 +1185,8 @@ impl<D: Deps> CurrentDepGraph<D> {
|
||||
record_stats: bool,
|
||||
previous: Arc<SerializedDepGraph>,
|
||||
) -> Self {
|
||||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
let duration = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
|
||||
let nanos = duration.as_nanos();
|
||||
let mut stable_hasher = StableHasher::new();
|
||||
nanos.hash(&mut stable_hasher);
|
||||
previous.session_count().hash(&mut stable_hasher);
|
||||
let anon_id_seed = stable_hasher.finish();
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
|
@ -92,6 +92,9 @@ pub struct SerializedDepGraph {
|
||||
/// Stores a map from fingerprints to nodes per dep node kind.
|
||||
/// This is the reciprocal of `nodes`.
|
||||
index: Vec<UnhashMap<PackedFingerprint, SerializedDepNodeIndex>>,
|
||||
/// The number of previous compilation sessions. This is used to generate
|
||||
/// unique anon dep nodes per session.
|
||||
session_count: u64,
|
||||
}
|
||||
|
||||
impl SerializedDepGraph {
|
||||
@ -146,6 +149,11 @@ impl SerializedDepGraph {
|
||||
pub fn node_count(&self) -> usize {
|
||||
self.nodes.len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn session_count(&self) -> u64 {
|
||||
self.session_count
|
||||
}
|
||||
}
|
||||
|
||||
/// A packed representation of an edge's start index and byte width.
|
||||
@ -252,6 +260,8 @@ impl SerializedDepGraph {
|
||||
.map(|_| UnhashMap::with_capacity_and_hasher(d.read_u32() as usize, Default::default()))
|
||||
.collect();
|
||||
|
||||
let session_count = d.read_u64();
|
||||
|
||||
for (idx, node) in nodes.iter_enumerated() {
|
||||
if index[node.kind.as_usize()].insert(node.hash, idx).is_some() {
|
||||
// Side effect nodes can have duplicates
|
||||
@ -273,6 +283,7 @@ impl SerializedDepGraph {
|
||||
edge_list_indices,
|
||||
edge_list_data,
|
||||
index,
|
||||
session_count,
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -601,7 +612,7 @@ impl<D: Deps> EncoderState<D> {
|
||||
stats: _,
|
||||
kind_stats,
|
||||
marker: _,
|
||||
previous: _,
|
||||
previous,
|
||||
} = self;
|
||||
|
||||
let node_count = total_node_count.try_into().unwrap();
|
||||
@ -612,6 +623,8 @@ impl<D: Deps> EncoderState<D> {
|
||||
count.encode(&mut encoder);
|
||||
}
|
||||
|
||||
previous.session_count.checked_add(1).unwrap().encode(&mut encoder);
|
||||
|
||||
debug!(?node_count, ?edge_count);
|
||||
debug!("position: {:?}", encoder.position());
|
||||
IntEncodedWithFixedSize(node_count).encode(&mut encoder);
|
||||
|
Loading…
Reference in New Issue
Block a user