Fix concurrent additions to liveNonProgramTypes
Bug: b/235454746
Change-Id: Ic4bf7d12e10da29fa3a133d7f13be3b5d9f43576
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 3addb2d..c731f7d 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -460,6 +460,8 @@
private final InterfaceProcessor interfaceProcessor;
+ private final Thread mainThreadForTesting = Thread.currentThread();
+
Enqueuer(
AppView<? extends AppInfoWithClassHierarchy> appView,
ExecutorService executorService,
@@ -686,6 +688,7 @@
ProgramDerivedContext context,
BiConsumer<DexClass, ProgramDerivedContext> foundClassConsumer,
BiConsumer<DexType, ProgramDerivedContext> missingClassConsumer) {
+ assert verifyIsMainThread();
return internalDefinitionFor(type, context, foundClassConsumer, missingClassConsumer)
.toSingleClassWithProgramOverLibrary();
}
@@ -1958,6 +1961,11 @@
// Actual actions performed.
//
+ private boolean verifyIsMainThread() {
+ assert Thread.currentThread() == mainThreadForTesting;
+ return true;
+ }
+
private boolean verifyMethodIsTargeted(ProgramMethod method) {
DexEncodedMethod definition = method.getDefinition();
assert !definition.isClassInitializer() : "Class initializers are never targeted";
@@ -3943,7 +3951,7 @@
lambdaCallback.andThen(
(clazz, context) -> {
for (DexType itf : clazz.getLambdaProgramClass().getInterfaces()) {
- if (definitionFor(itf, context) == null) {
+ if (appInfo().definitionFor(itf, context) == null) {
for (ProgramMethod method :
clazz.getLambdaProgramClass().virtualProgramMethods()) {
synchronized (additions) {