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 39901f4..f668aca 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -458,6 +458,8 @@
private final InterfaceProcessor interfaceProcessor;
+ private final Thread mainThreadForTesting = Thread.currentThread();
+
Enqueuer(
AppView<? extends AppInfoWithClassHierarchy> appView,
ExecutorService executorService,
@@ -676,6 +678,7 @@
DexType type,
ProgramDerivedContext context,
BiConsumer<DexType, ProgramDerivedContext> missingClassConsumer) {
+ assert verifyIsMainThread();
return internalDefinitionFor(type, context, missingClassConsumer);
}
@@ -1721,6 +1724,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";
@@ -3607,7 +3615,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) {