Merge "Synchronize cache-is-ready boolean with cache readiness." into tm-dev

This commit is contained in:
Alex Buynytskyy
2022-05-13 04:48:34 +00:00
committed by Android (Google) Code Review
4 changed files with 29 additions and 17 deletions

View File

@@ -173,7 +173,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
* {@link #shouldFilterApplicationInternal(PackageDataSnapshot, int, Object, * {@link #shouldFilterApplicationInternal(PackageDataSnapshot, int, Object,
* PackageStateInternal, int)} call. * PackageStateInternal, int)} call.
* NOTE: It can only be relied upon after the system is ready to avoid unnecessary update on * NOTE: It can only be relied upon after the system is ready to avoid unnecessary update on
* initial scam and is empty until {@link #mSystemReady} is true. * initial scam and is empty until {@link #mCacheReady} is true.
*/ */
@NonNull @NonNull
@Watched @Watched
@@ -181,7 +181,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
@NonNull @NonNull
protected SnapshotCache<WatchedSparseBooleanMatrix> mShouldFilterCacheSnapshot; protected SnapshotCache<WatchedSparseBooleanMatrix> mShouldFilterCacheSnapshot;
protected volatile boolean mSystemReady = false; protected volatile boolean mCacheReady = false;
protected boolean isForceQueryable(int callingAppId) { protected boolean isForceQueryable(int callingAppId) {
return mForceQueryable.contains(callingAppId); return mForceQueryable.contains(callingAppId);
@@ -312,7 +312,7 @@ public abstract class AppsFilterBase implements AppsFilterSnapshot {
|| callingAppId == targetPkgSetting.getAppId()) { || callingAppId == targetPkgSetting.getAppId()) {
return false; return false;
} }
if (mSystemReady) { // use cache if (mCacheReady) { // use cache
if (!shouldFilterApplicationUsingCache(callingUid, if (!shouldFilterApplicationUsingCache(callingUid,
targetPkgSetting.getAppId(), targetPkgSetting.getAppId(),
userId)) { userId)) {

View File

@@ -404,7 +404,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
+ recipientUid + " -> " + visibleUid); + recipientUid + " -> " + visibleUid);
} }
if (mSystemReady) { // TODO(b/231528435): invalidate cache instead of locking.
if (true/*mCacheReady*/) {
synchronized (mCacheLock) { synchronized (mCacheLock) {
// update the cache in a one-off manner since we've got all the information we // update the cache in a one-off manner since we've got all the information we
// need. // need.
@@ -420,7 +421,6 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
mFeatureConfig.onSystemReady(); mFeatureConfig.onSystemReady();
updateEntireShouldFilterCacheAsync(pmInternal); updateEntireShouldFilterCacheAsync(pmInternal);
mSystemReady = true;
} }
/** /**
@@ -444,7 +444,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
final UserInfo[] users = snapshot.getUserInfos(); final UserInfo[] users = snapshot.getUserInfos();
final ArraySet<String> additionalChangedPackages = final ArraySet<String> additionalChangedPackages =
addPackageInternal(newPkgSetting, settings); addPackageInternal(newPkgSetting, settings);
if (mSystemReady) { // TODO(b/231528435): invalidate cache instead of locking.
if (true/*mCacheReady*/) {
synchronized (mCacheLock) { synchronized (mCacheLock) {
updateShouldFilterCacheForPackage(snapshot, null, newPkgSetting, updateShouldFilterCacheForPackage(snapshot, null, newPkgSetting,
settings, users, USER_ALL, settings.size()); settings, users, USER_ALL, settings.size());
@@ -586,7 +587,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
} }
private void removeAppIdFromVisibilityCache(int appId) { private void removeAppIdFromVisibilityCache(int appId) {
if (!mSystemReady) { if (!mCacheReady) {
return; return;
} }
synchronized (mCacheLock) { synchronized (mCacheLock) {
@@ -661,18 +662,20 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
updateEntireShouldFilterCacheInner(snapshot, settings, usersRef[0], USER_ALL); updateEntireShouldFilterCacheInner(snapshot, settings, usersRef[0], USER_ALL);
onChanged(); onChanged();
mCacheReady = true;
}); });
} }
public void onUserCreated(PackageDataSnapshot snapshot, int newUserId) { public void onUserCreated(PackageDataSnapshot snapshot, int newUserId) {
if (!mSystemReady) { if (!mCacheReady) {
return; return;
} }
updateEntireShouldFilterCache(snapshot, newUserId); updateEntireShouldFilterCache(snapshot, newUserId);
} }
public void onUserDeleted(@UserIdInt int userId) { public void onUserDeleted(@UserIdInt int userId) {
if (!mSystemReady) { if (!mCacheReady) {
return; return;
} }
removeShouldFilterCacheForUser(userId); removeShouldFilterCacheForUser(userId);
@@ -681,7 +684,7 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
private void updateShouldFilterCacheForPackage(PackageDataSnapshot snapshot, private void updateShouldFilterCacheForPackage(PackageDataSnapshot snapshot,
String packageName) { String packageName) {
if (!mSystemReady) { if (!mCacheReady) {
return; return;
} }
final ArrayMap<String, ? extends PackageStateInternal> settings = final ArrayMap<String, ? extends PackageStateInternal> settings =
@@ -930,7 +933,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
} }
removeAppIdFromVisibilityCache(setting.getAppId()); removeAppIdFromVisibilityCache(setting.getAppId());
if (mSystemReady && setting.hasSharedUser()) { // TODO(b/231528435): invalidate cache instead of locking.
if (/*mCacheReady && */setting.hasSharedUser()) {
final ArraySet<? extends PackageStateInternal> sharedUserPackages = final ArraySet<? extends PackageStateInternal> sharedUserPackages =
getSharedUserPackages(setting.getSharedUserAppId(), sharedUserSettings); getSharedUserPackages(setting.getSharedUserAppId(), sharedUserSettings);
for (int i = sharedUserPackages.size() - 1; i >= 0; i--) { for (int i = sharedUserPackages.size() - 1; i >= 0; i--) {
@@ -947,7 +951,8 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
} }
} }
if (mSystemReady) { // TODO(b/231528435): invalidate cache instead of locking.
if (true/*mCacheReady*/) {
if (additionalChangedPackages != null) { if (additionalChangedPackages != null) {
for (int index = 0; index < additionalChangedPackages.size(); index++) { for (int index = 0; index < additionalChangedPackages.size(); index++) {
String changedPackage = additionalChangedPackages.valueAt(index); String changedPackage = additionalChangedPackages.valueAt(index);

View File

@@ -32,7 +32,7 @@ abstract class AppsFilterLocked extends AppsFilterBase {
/** /**
* Guards the access for {@link AppsFilterBase#mShouldFilterCache}; * Guards the access for {@link AppsFilterBase#mShouldFilterCache};
*/ */
protected Object mCacheLock = new Object(); protected final Object mCacheLock = new Object();
@Override @Override
protected boolean isForceQueryable(int appId) { protected boolean isForceQueryable(int appId) {

View File

@@ -17,6 +17,7 @@
package com.android.server.pm; package com.android.server.pm;
import com.android.server.utils.SnapshotCache; import com.android.server.utils.SnapshotCache;
import com.android.server.utils.WatchedSparseBooleanMatrix;
import java.util.Arrays; import java.util.Arrays;
@@ -49,12 +50,18 @@ public final class AppsFilterSnapshotImpl extends AppsFilterBase {
mFeatureConfig = orig.mFeatureConfig.snapshot(); mFeatureConfig = orig.mFeatureConfig.snapshot();
mOverlayReferenceMapper = orig.mOverlayReferenceMapper; mOverlayReferenceMapper = orig.mOverlayReferenceMapper;
mSystemSigningDetails = orig.mSystemSigningDetails; mSystemSigningDetails = orig.mSystemSigningDetails;
synchronized (orig.mCacheLock) {
mShouldFilterCache = orig.mShouldFilterCacheSnapshot.snapshot(); mCacheReady = orig.mCacheReady;
mShouldFilterCacheSnapshot = new SnapshotCache.Sealed<>(); if (mCacheReady) {
synchronized (orig.mCacheLock) {
mShouldFilterCache = orig.mShouldFilterCacheSnapshot.snapshot();
}
} else {
// cache is not ready, use an empty cache for the snapshot
mShouldFilterCache = new WatchedSparseBooleanMatrix();
} }
mShouldFilterCacheSnapshot = new SnapshotCache.Sealed<>();
mBackgroundExecutor = null; mBackgroundExecutor = null;
mSystemReady = orig.mSystemReady;
} }
} }