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:
committed by
Automerger Merge Worker
commit
75c6b35d4b
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user