diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
3 files changed, 37 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/util/GroupedList.java b/src/main/java/com/google/devtools/build/lib/util/GroupedList.java index c1985cd57c..475e38518b 100644 --- a/src/main/java/com/google/devtools/build/lib/util/GroupedList.java +++ b/src/main/java/com/google/devtools/build/lib/util/GroupedList.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.devtools.build.lib.collect.compacthashset.CompactHashSet; import java.util.ArrayList; import java.util.Collection; @@ -57,6 +58,11 @@ public class GroupedList<T> implements Iterable<Collection<T>> { this.elements = new ArrayList<>(elements); } + private GroupedList(int size, Object[] elements) { + this.size = size; + this.elements = Lists.newArrayList(elements); + } + /** * Appends the list constructed in {@code helper} to this list. Returns the elements of {@code * helper}, uniquified. @@ -210,18 +216,32 @@ public class GroupedList<T> implements Iterable<Collection<T>> { return new GroupedList<>(); } if (compressed.getClass().isArray()) { - List<Object> elements = new ArrayList<>(); int size = 0; - for (Object item : (Object[]) compressed) { + Object[] compressedArray = ((Object[]) compressed); + for (Object item : compressedArray) { size += sizeOf(item); - elements.add(item); } - return new GroupedList<>(size, elements); + return new GroupedList<>(size, compressedArray); } // Just a single element. return new GroupedList<>(1, ImmutableList.of(compressed)); } + public static int numElements(Object compressed) { + if (compressed == EMPTY_LIST) { + return 0; + } + if (compressed.getClass().isArray()) { + int size = 0; + for (Object item : (Object[]) compressed) { + size += sizeOf(item); + } + return size; + } + // Just a single element. + return 1; + } + @Override public int hashCode() { // Hashing requires getting an order-independent hash for each element of this.elements. That diff --git a/src/main/java/com/google/devtools/build/skyframe/DirtyBuildingState.java b/src/main/java/com/google/devtools/build/skyframe/DirtyBuildingState.java index 53e43f0513..d802c3d673 100644 --- a/src/main/java/com/google/devtools/build/skyframe/DirtyBuildingState.java +++ b/src/main/java/com/google/devtools/build/skyframe/DirtyBuildingState.java @@ -55,6 +55,9 @@ public abstract class DirtyBuildingState { */ protected abstract int getNumOfGroupsInLastBuildDirectDeps(); + /** The number of total dependencies requested the last time the node was built. */ + public abstract int getNumElementsInLastBuildDirectDeps(); + /** * The value of the node the last time it was built. * @@ -237,6 +240,11 @@ public abstract class DirtyBuildingState { } @Override + public int getNumElementsInLastBuildDirectDeps() { + return lastBuildDirectDeps.numElements(); + } + + @Override protected MoreObjects.ToStringHelper getStringHelper() { return super.getStringHelper() .add("lastBuildDirectDeps", lastBuildDirectDeps) diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java index ee80c29637..2ad10d285e 100644 --- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java +++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java @@ -233,6 +233,11 @@ public class InMemoryNodeEntry implements NodeEntry { return GroupedList.create(directDeps); } + public int getNumDirectDeps() { + Preconditions.checkState(isDone(), "no deps until done. NodeEntry: %s", this); + return GroupedList.numElements(directDeps); + } + @Override @Nullable public synchronized ErrorInfo getErrorInfo() { |