diff options
author | 2017-11-29 11:31:49 -0800 | |
---|---|---|
committer | 2017-11-29 11:33:22 -0800 | |
commit | 5d6343601c3fbe301bcb76b50dbdbf9223bce69d (patch) | |
tree | 04dedfedc547fd87380d27e35ac3a2af0cb95eb9 /src/main/java/com/google/devtools | |
parent | 00bece2ac9d458f1afba8f9932a65eceb8df55d8 (diff) |
Add a static method GroupedList#numElements to allow to count the number of deps from a compressed GroupedList without uncompressing it. Also some minor GC improvements.
PiperOrigin-RevId: 177338852
Diffstat (limited to 'src/main/java/com/google/devtools')
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() { |