diff options
Diffstat (limited to 'src')
4 files changed, 44 insertions, 5 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() { diff --git a/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java b/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java index a260cc7e8b..2f3c318d57 100644 --- a/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java +++ b/src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +/** Unit tests for {@link GroupedList}. */ @RunWith(JUnit4.class) public class GroupedListTest { @Test @@ -149,6 +150,7 @@ public class GroupedListTest { assertThat(groupedList.numElements()).isEqualTo(allElts.size()); assertThat(groupedList.isEmpty()).isFalse(); Object compressed = groupedList.compress(); + assertThat(GroupedList.numElements(compressed)).isEqualTo(groupedList.numElements()); assertElementsEqual(compressed, allElts); assertElementsEqualInGroups(GroupedList.<String>create(compressed), elements); assertElementsEqualInGroups(groupedList, elements); @@ -229,6 +231,7 @@ public class GroupedListTest { Set<String> removed = ImmutableSet.of("2a", "3", "removedGroup1", "removedGroup2"); groupedList.remove(removed); Object compressed = groupedList.compress(); + assertThat(GroupedList.numElements(compressed)).isEqualTo(groupedList.numElements()); allElts.removeAll(removed); assertElementsEqual(compressed, allElts); elements.get(2).remove("2a"); @@ -258,6 +261,7 @@ public class GroupedListTest { Set<String> removed = ImmutableSet.of("1b", "1c"); groupedList.remove(removed); Object compressed = groupedList.compress(); + assertThat(GroupedList.numElements(compressed)).isEqualTo(groupedList.numElements()); allElts.removeAll(removed); assertElementsEqual(compressed, allElts); elements.get(0).removeAll(removed); @@ -274,7 +278,9 @@ public class GroupedListTest { } helper.endGroup(); result.append(helper); - return result.compress(); + Object compressed = result.compress(); + assertThat(GroupedList.numElements(compressed)).isEqualTo(result.numElements()); + return compressed; } private static Iterable<String> iterable(Object compressed) { |