Merge "Fix deadlock on CompatConfig.mChanges" am: eaf3fd59ff am: 0f53ddc205

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1605516

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I9086ea63f1a062819e686d510b013dfb446fb3e7
This commit is contained in:
Andrei-Valentin Onea
2021-02-26 17:33:30 +00:00
committed by Automerger Merge Worker

View File

@@ -50,6 +50,7 @@ import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -595,18 +596,24 @@ final class CompatConfig {
* Rechecks all the existing overrides for a package. * Rechecks all the existing overrides for a package.
*/ */
void recheckOverrides(String packageName) { void recheckOverrides(String packageName) {
// Local cache of compat changes. Holding a lock on mChanges for the whole duration of the
// method will cause a deadlock.
List<CompatChange> changes;
synchronized (mChanges) { synchronized (mChanges) {
boolean shouldInvalidateCache = false; changes = new ArrayList<>(mChanges.size());
for (int idx = 0; idx < mChanges.size(); ++idx) { for (int idx = 0; idx < mChanges.size(); ++idx) {
CompatChange c = mChanges.valueAt(idx); changes.add(mChanges.valueAt(idx));
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(c.getId(), packageName);
shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext);
}
if (shouldInvalidateCache) {
invalidateCache();
} }
} }
boolean shouldInvalidateCache = false;
for (CompatChange c: changes) {
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(c.getId(), packageName);
shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext);
}
if (shouldInvalidateCache) {
invalidateCache();
}
} }
void registerContentObserver() { void registerContentObserver() {