debug_heap->Verify();
#endif
- SetProgressTotal(2); // 2 passes.
+ SetProgressTotal(4); // 2 passes + dominators + sizes.
#ifdef DEBUG
debug_heap->Verify();
affected[children[i].to()->ordered_index()] = true;
}
- bool changed = true;
- while (changed) {
- changed = false;
+ int changed = 1;
+ const int base_progress_counter = progress_counter_;
+ while (changed != 0) {
+ changed = 0;
for (int i = root_index - 1; i >= 0; --i) {
// If dominator of the entry has already been set to root,
// then it can't propagate any further.
if (new_idom_index != kNoDominator
&& dominators->at(i) != new_idom_index) {
(*dominators)[i] = new_idom_index;
- changed = true;
+ ++changed;
Vector<HeapGraphEdge> children = entries[i]->children();
for (int j = 0; j < children.length(); ++j) {
affected[children[j].to()->ordered_index()] = true;
}
}
}
+ int remaining = entries_length - changed;
+ ASSERT(remaining >= 0);
+ progress_counter_ = base_progress_counter + remaining;
+ if (!ProgressReport(true)) return false;
}
return true;
}
// As for the dominators tree we only know parent nodes, not
// children, to sum up total sizes we "bubble" node's self size
// adding it to all of its parents.
- List<HeapEntry*>& entries = *snapshot_->entries();
- for (int i = 0; i < entries.length(); ++i) {
- HeapEntry* entry = entries[i];
+ for (int i = 0; i < snapshot_->entries()->length(); ++i) {
+ HeapEntry* entry = snapshot_->entries()->at(i);
entry->set_retained_size(entry->self_size());
}
- for (int i = 0; i < entries.length(); ++i) {
- HeapEntry* entry = entries[i];
+ for (int i = 0;
+ i < snapshot_->entries()->length();
+ ++i, ProgressStep()) {
+ HeapEntry* entry = snapshot_->entries()->at(i);
int entry_size = entry->self_size();
for (HeapEntry* dominator = entry->dominator();
dominator != entry;
entry = dominator, dominator = entry->dominator()) {
dominator->add_retained_size(entry_size);
}
+ if (!ProgressReport()) return false;
}
return true;
}