1
Fork 0

Create a forever red node and use it to force side effects.

This commit is contained in:
Camille GILLOT 2022-04-27 19:18:26 +02:00
parent 682f57656e
commit 15530a1c84
5 changed files with 26 additions and 37 deletions

View file

@ -43,6 +43,7 @@ rustc_index::newtype_index! {
impl DepNodeIndex {
pub const INVALID: DepNodeIndex = DepNodeIndex::MAX;
pub const SINGLETON_DEPENDENCYLESS_ANON_NODE: DepNodeIndex = DepNodeIndex::from_u32(0);
pub const FOREVER_RED_NODE: DepNodeIndex = DepNodeIndex::from_u32(1);
}
impl std::convert::From<DepNodeIndex> for QueryInvocationId {
@ -124,6 +125,8 @@ impl<K: DepKind> DepGraph<K> {
record_stats,
);
let colors = DepNodeColorMap::new(prev_graph_node_count);
// Instantiate a dependy-less node only once for anonymous queries.
let _green_node_index = current.intern_new_node(
profiler,
@ -133,6 +136,18 @@ impl<K: DepKind> DepGraph<K> {
);
debug_assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
// Instantiate a dependy-less red node only once for anonymous queries.
let (_red_node_index, _prev_and_index) = current.intern_node(
profiler,
&prev_graph,
DepNode { kind: DepKind::NULL, hash: Fingerprint::ZERO.into() },
smallvec![],
None,
false,
);
debug_assert_eq!(_red_node_index, DepNodeIndex::FOREVER_RED_NODE);
debug_assert!(matches!(_prev_and_index, None | Some((_, DepNodeColor::Red))));
DepGraph {
data: Some(Lrc::new(DepGraphData {
previous_work_products: prev_work_products,
@ -140,7 +155,7 @@ impl<K: DepKind> DepGraph<K> {
current,
processed_side_effects: Default::default(),
previous: prev_graph,
colors: DepNodeColorMap::new(prev_graph_node_count),
colors,
debug_loaded_from_disk: Default::default(),
})),
virtual_dep_node_index: Lrc::new(AtomicU32::new(0)),
@ -965,6 +980,9 @@ impl<K: DepKind> CurrentDepGraph<K> {
let nanos = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64;
let mut stable_hasher = StableHasher::new();
nanos.hash(&mut stable_hasher);
let anon_id_seed = stable_hasher.finish();
// We rely on the fact that `anon_id_seed` is not zero when creating static nodes.
debug_assert_ne!(anon_id_seed, Fingerprint::ZERO);
#[cfg(debug_assertions)]
let forbidden_edge = match env::var("RUST_FORBID_DEP_GRAPH_EDGE") {
@ -1000,7 +1018,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
)
}),
prev_index_to_index: Lock::new(IndexVec::from_elem_n(None, prev_graph_node_count)),
anon_id_seed: stable_hasher.finish(),
anon_id_seed,
#[cfg(debug_assertions)]
forbidden_edge,
total_read_count: AtomicU64::new(0),