Merge "Avoid locking mChanges when not necessary" into sc-dev am: 7dfe7b74a7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14971030

Change-Id: Id983e32dffd2cf87df2fdbf08c1c1d6c27a13ac2
This commit is contained in:
Tom Natan
2021-06-15 11:28:15 +00:00
committed by Automerger Merge Worker

View File

@@ -235,13 +235,11 @@ final class CompatConfig {
* @param packageName app for which the overrides will be applied.
*/
void addOverrides(CompatibilityOverrideConfig overrides, String packageName) {
synchronized (mChanges) {
for (Long changeId : overrides.overrides.keySet()) {
addOverrideUnsafe(changeId, packageName, overrides.overrides.get(changeId));
}
saveOverrides();
invalidateCache();
for (Long changeId : overrides.overrides.keySet()) {
addOverrideUnsafe(changeId, packageName, overrides.overrides.get(changeId));
}
saveOverrides();
invalidateCache();
}
private boolean addOverrideUnsafe(long changeId, String packageName,
@@ -335,26 +333,37 @@ final class CompatConfig {
/**
* Unsafe version of {@link #removeOverride(long, String)}.
* It does not invalidate the cache nor save the overrides.
* It does not save the overrides.
*/
private boolean removeOverrideUnsafe(long changeId, String packageName) {
Long versionCode = getVersionCodeOrNull(packageName);
synchronized (mChanges) {
CompatChange c = mChanges.get(changeId);
if (c != null) {
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(changeId, packageName);
if (c.hasPackageOverride(packageName)) {
allowedState.enforce(changeId, packageName);
c.removePackageOverride(packageName, allowedState, versionCode);
invalidateCache();
return true;
}
return removeOverrideUnsafe(c, packageName, versionCode);
}
}
return false;
}
/**
* Similar to {@link #removeOverrideUnsafe(long, String)} except this method receives a {@link
* CompatChange} directly as well as the package's version code.
*/
private boolean removeOverrideUnsafe(CompatChange change, String packageName,
@Nullable Long versionCode) {
long changeId = change.getId();
OverrideAllowedState allowedState =
mOverrideValidator.getOverrideAllowedState(changeId, packageName);
if (change.hasPackageOverride(packageName)) {
allowedState.enforce(changeId, packageName);
change.removePackageOverride(packageName, allowedState, versionCode);
invalidateCache();
return true;
}
return false;
}
/**
* Removes all overrides previously added via {@link #addOverride(long, String, boolean)} or
* {@link #addOverrides(CompatibilityOverrideConfig, String)} for a certain package.
@@ -364,10 +373,11 @@ final class CompatConfig {
* @param packageName the package for which the overrides should be purged
*/
void removePackageOverrides(String packageName) {
Long versionCode = getVersionCodeOrNull(packageName);
synchronized (mChanges) {
for (int i = 0; i < mChanges.size(); ++i) {
CompatChange change = mChanges.valueAt(i);
removeOverrideUnsafe(change.getId(), packageName);
removeOverrideUnsafe(change, packageName, versionCode);
}
saveOverrides();
invalidateCache();
@@ -386,13 +396,11 @@ final class CompatConfig {
*/
void removePackageOverrides(CompatibilityOverridesToRemoveConfig overridesToRemove,
String packageName) {
synchronized (mChanges) {
for (Long changeId : overridesToRemove.changeIds) {
removeOverrideUnsafe(changeId, packageName);
}
saveOverrides();
invalidateCache();
for (Long changeId : overridesToRemove.changeIds) {
removeOverrideUnsafe(changeId, packageName);
}
saveOverrides();
invalidateCache();
}
private long[] getAllowedChangesSinceTargetSdkForPackage(String packageName,