diff options
| author | 2021-02-26 16:26:21 +0000 | |
|---|---|---|
| committer | 2021-02-26 16:26:21 +0000 | |
| commit | eaf3fd59ff13c97ffec994d3cd1eafe96e0472fb (patch) | |
| tree | 7a7831e674f0913e71aa547d65eec102fb343f8d | |
| parent | 523e3b9b7922685cff53d046884e0037004dcea7 (diff) | |
| parent | 1ec53ec50776cd1c6539bd5e339a951b990a1c76 (diff) | |
Merge "Fix deadlock on CompatConfig.mChanges"
| -rw-r--r-- | services/core/java/com/android/server/compat/CompatConfig.java | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index 422991e082a9..66a652053857 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -50,6 +50,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -595,18 +596,24 @@ final class CompatConfig { * Rechecks all the existing overrides for a package. */ 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) { - boolean shouldInvalidateCache = false; + changes = new ArrayList<>(mChanges.size()); for (int idx = 0; idx < mChanges.size(); ++idx) { - CompatChange c = mChanges.valueAt(idx); - OverrideAllowedState allowedState = - mOverrideValidator.getOverrideAllowedState(c.getId(), packageName); - shouldInvalidateCache |= c.recheckOverride(packageName, allowedState, mContext); - } - if (shouldInvalidateCache) { - invalidateCache(); + changes.add(mChanges.valueAt(idx)); } } + 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() { |