77 lines
3.2 KiB
Java
77 lines
3.2 KiB
Java
package com.squareup.haha.perflib.analysis;
|
|
|
|
import com.squareup.haha.guava.collect.ImmutableList;
|
|
import com.squareup.haha.guava.collect.Iterables;
|
|
import com.squareup.haha.perflib.Heap;
|
|
import com.squareup.haha.perflib.Instance;
|
|
import com.squareup.haha.perflib.RootObj;
|
|
import com.squareup.haha.perflib.Snapshot;
|
|
import java.util.Iterator;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class Dominators {
|
|
private final Snapshot mSnapshot;
|
|
private final ImmutableList<Instance> mTopSort;
|
|
|
|
public Dominators(Snapshot snapshot, ImmutableList<Instance> immutableList) {
|
|
this.mSnapshot = snapshot;
|
|
this.mTopSort = immutableList;
|
|
Iterator<RootObj> it = snapshot.getGCRoots().iterator();
|
|
while (it.hasNext()) {
|
|
Instance referredInstance = it.next().getReferredInstance();
|
|
if (referredInstance != null) {
|
|
referredInstance.setImmediateDominator(Snapshot.SENTINEL_ROOT);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void computeDominators() {
|
|
boolean z;
|
|
for (boolean z2 = true; z2; z2 = z) {
|
|
z = false;
|
|
for (int i = 0; i < this.mTopSort.size(); i++) {
|
|
Instance instance = this.mTopSort.get(i);
|
|
if (instance.getImmediateDominator() != Snapshot.SENTINEL_ROOT) {
|
|
Instance instance2 = null;
|
|
for (int i2 = 0; i2 < instance.getHardReferences().size(); i2++) {
|
|
Instance instance3 = instance.getHardReferences().get(i2);
|
|
if (instance3.getImmediateDominator() != null) {
|
|
if (instance2 == null) {
|
|
instance2 = instance3;
|
|
} else {
|
|
while (instance2 != instance3) {
|
|
if (instance2.getTopologicalOrder() < instance3.getTopologicalOrder()) {
|
|
instance3 = instance3.getImmediateDominator();
|
|
} else {
|
|
instance2 = instance2.getImmediateDominator();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (instance.getImmediateDominator() != instance2) {
|
|
instance.setImmediateDominator(instance2);
|
|
z = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void computeRetainedSizes() {
|
|
for (Heap heap : this.mSnapshot.getHeaps()) {
|
|
Iterator it = Iterables.concat(heap.getClasses(), heap.getInstances()).iterator();
|
|
while (it.hasNext()) {
|
|
((Instance) it.next()).resetRetainedSize();
|
|
}
|
|
}
|
|
computeDominators();
|
|
for (Instance instance : this.mSnapshot.getReachableInstances()) {
|
|
int heapIndex = this.mSnapshot.getHeapIndex(instance.getHeap());
|
|
for (Instance immediateDominator = instance.getImmediateDominator(); immediateDominator != Snapshot.SENTINEL_ROOT; immediateDominator = immediateDominator.getImmediateDominator()) {
|
|
immediateDominator.addRetainedSize(heapIndex, instance.getSize());
|
|
}
|
|
}
|
|
}
|
|
}
|