Create a forever red node and use it to force side effects.
This commit is contained in:
parent
682f57656e
commit
15530a1c84
5 changed files with 26 additions and 37 deletions
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue