Auto merge of #3827 - RalfJung:gc-comment, r=RalfJung
provenance_gc: fix comment Fixes https://github.com/rust-lang/miri/issues/3826 r? `@saethlin`
This commit is contained in:
commit
eb7bf6e8f5
@ -184,12 +184,35 @@ pub fn is_live(&self, id: AllocId) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn remove_unreachable_tags<'tcx>(this: &mut MiriInterpCx<'tcx>, tags: FxHashSet<BorTag>) {
|
||||||
|
// Avoid iterating all allocations if there's no borrow tracker anyway.
|
||||||
|
if this.machine.borrow_tracker.is_some() {
|
||||||
|
this.memory.alloc_map().iter(|it| {
|
||||||
|
for (_id, (_kind, alloc)) in it {
|
||||||
|
alloc.extra.borrow_tracker.as_ref().unwrap().remove_unreachable_tags(&tags);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_unreachable_allocs<'tcx>(this: &mut MiriInterpCx<'tcx>, allocs: FxHashSet<AllocId>) {
|
||||||
|
let allocs = LiveAllocs { ecx: this, collected: allocs };
|
||||||
|
this.machine.allocation_spans.borrow_mut().retain(|id, _| allocs.is_live(*id));
|
||||||
|
this.machine.symbolic_alignment.borrow_mut().retain(|id, _| allocs.is_live(*id));
|
||||||
|
this.machine.alloc_addresses.borrow_mut().remove_unreachable_allocs(&allocs);
|
||||||
|
if let Some(borrow_tracker) = &this.machine.borrow_tracker {
|
||||||
|
borrow_tracker.borrow_mut().remove_unreachable_allocs(&allocs);
|
||||||
|
}
|
||||||
|
// Clean up core (non-Miri-specific) state.
|
||||||
|
this.remove_unreachable_allocs(&allocs.collected);
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> EvalContextExt<'tcx> for crate::MiriInterpCx<'tcx> {}
|
impl<'tcx> EvalContextExt<'tcx> for crate::MiriInterpCx<'tcx> {}
|
||||||
pub trait EvalContextExt<'tcx>: MiriInterpCxExt<'tcx> {
|
pub trait EvalContextExt<'tcx>: MiriInterpCxExt<'tcx> {
|
||||||
fn run_provenance_gc(&mut self) {
|
fn run_provenance_gc(&mut self) {
|
||||||
// We collect all tags from various parts of the interpreter, but also
|
|
||||||
let this = self.eval_context_mut();
|
let this = self.eval_context_mut();
|
||||||
|
|
||||||
|
// We collect all tags and AllocId from every part of the interpreter.
|
||||||
let mut tags = FxHashSet::default();
|
let mut tags = FxHashSet::default();
|
||||||
let mut alloc_ids = FxHashSet::default();
|
let mut alloc_ids = FxHashSet::default();
|
||||||
this.visit_provenance(&mut |id, tag| {
|
this.visit_provenance(&mut |id, tag| {
|
||||||
@ -200,30 +223,9 @@ fn run_provenance_gc(&mut self) {
|
|||||||
tags.insert(tag);
|
tags.insert(tag);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
self.remove_unreachable_tags(tags);
|
|
||||||
self.remove_unreachable_allocs(alloc_ids);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove_unreachable_tags(&mut self, tags: FxHashSet<BorTag>) {
|
// Based on this, clean up the interpreter state.
|
||||||
let this = self.eval_context_mut();
|
remove_unreachable_tags(this, tags);
|
||||||
this.memory.alloc_map().iter(|it| {
|
remove_unreachable_allocs(this, alloc_ids);
|
||||||
for (_id, (_kind, alloc)) in it {
|
|
||||||
if let Some(bt) = &alloc.extra.borrow_tracker {
|
|
||||||
bt.remove_unreachable_tags(&tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn remove_unreachable_allocs(&mut self, allocs: FxHashSet<AllocId>) {
|
|
||||||
let this = self.eval_context_mut();
|
|
||||||
let allocs = LiveAllocs { ecx: this, collected: allocs };
|
|
||||||
this.machine.allocation_spans.borrow_mut().retain(|id, _| allocs.is_live(*id));
|
|
||||||
this.machine.symbolic_alignment.borrow_mut().retain(|id, _| allocs.is_live(*id));
|
|
||||||
this.machine.alloc_addresses.borrow_mut().remove_unreachable_allocs(&allocs);
|
|
||||||
if let Some(borrow_tracker) = &this.machine.borrow_tracker {
|
|
||||||
borrow_tracker.borrow_mut().remove_unreachable_allocs(&allocs);
|
|
||||||
}
|
|
||||||
this.remove_unreachable_allocs(&allocs.collected);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user