diff options
| author | 2022-04-14 18:46:20 -0700 | |
|---|---|---|
| committer | 2022-04-14 18:47:06 -0700 | |
| commit | 09d24aba05f20bb223d3c58da09d499fad4d504d (patch) | |
| tree | e9a5115baeed9936299b3b845671335958c3244a | |
| parent | b121b54fb47769fffefff7b4f155eb4823723838 (diff) | |
Lock ComponentResolver when taking snapshot
Otherwise it's possible to hit a concurrent modification exception
when the data structures are edited while a snapshot is being taken.
Bug: 229326910
Test: presubmit
Change-Id: Ib15551a5096c47f5a238863466af08a4a88f82b9
| -rw-r--r-- | services/core/java/com/android/server/pm/resolution/ComponentResolver.java | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java index 9aa53f18d0aa..7baec6217e2e 100644 --- a/services/core/java/com/android/server/pm/resolution/ComponentResolver.java +++ b/services/core/java/com/android/server/pm/resolution/ComponentResolver.java @@ -79,7 +79,8 @@ import java.util.Set; import java.util.function.Function; /** Resolves all Android component types [activities, services, providers and receivers]. */ -public class ComponentResolver extends ComponentResolverLocked implements Snappable { +public class ComponentResolver extends ComponentResolverLocked implements + Snappable<ComponentResolverApi> { private static final boolean DEBUG = false; private static final String TAG = "PackageManager"; private static final boolean DEBUG_FILTERS = false; @@ -166,11 +167,13 @@ public class ComponentResolver extends ComponentResolverLocked implements Snappa mProvidersByAuthority = new ArrayMap<>(); mDeferProtectedFilters = true; - mSnapshot = new SnapshotCache<ComponentResolverApi>(this, this) { + mSnapshot = new SnapshotCache<>(this, this) { @Override public ComponentResolverApi createSnapshot() { - return new ComponentResolverSnapshot(ComponentResolver.this, - userNeedsBadgingCache); + synchronized (mLock) { + return new ComponentResolverSnapshot(ComponentResolver.this, + userNeedsBadgingCache); + } }}; } |