Fix high traffic PMS lockless methods

The notifyPackageUse method is called so many times that it is
causing a spike in snapshot invalidations. This reverts to a
(broken) S state where the code takes the lock and updates
the time value, but doesn't actually invalidate the snapshot,
preventing the re-generation.

Also fixes a check in grantImplicitAccess that was calling
onChanged() even though nothing changed, which was the other
significant method.

Test: manual, run profiling steps in bug on pre-change and post-change
Test: atest AppsFilterImplTest

Bug: 236021119

Change-Id: I20b1bb1d8b4f3df09c901f39db8462ab1a67607d
This commit is contained in:
Winson Chiu
2022-06-15 15:40:08 +00:00
parent 565f6d457f
commit e574a37db1
3 changed files with 14 additions and 6 deletions

View File

@@ -418,7 +418,9 @@ public final class AppsFilterImpl extends AppsFilterLocked implements Watchable,
} else if (changed) {
invalidateCache("grantImplicitAccess: " + recipientUid + " -> " + visibleUid);
}
onChanged();
if (changed) {
onChanged();
}
return changed;
}

View File

@@ -2859,12 +2859,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mDexOptHelper.performPackageDexOptUpgradeIfNeeded();
}
private void notifyPackageUseInternal(String packageName, int reason) {
long time = System.currentTimeMillis();
commitPackageStateMutation(null, packageName, packageState -> {
packageState.setLastPackageUsageTime(reason, time);
});
synchronized (mLock) {
final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
if (pkgSetting == null) {
return;
}
pkgSetting.getPkgState().setLastPackageUsageTimeInMills(reason, time);
}
}
/*package*/ DexManager getDexManager() {

View File

@@ -79,7 +79,10 @@ public class PackageStateUnserialized {
return this;
}
getLastPackageUsageTimeInMills()[reason] = time;
mPackageSetting.onChanged();
// TODO(b/236180425): This method does not notify snapshot changes because it's called too
// frequently, causing too many re-takes. This should be moved to a separate data structure
// or merged with the general UsageStats to avoid tracking heavily mutated data in the
// package data snapshot.
return this;
}