aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/util/GroupedList.java28
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/DirtyBuildingState.java8
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/util/GroupedListTest.java8
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) {