Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e8d7112 authored by Andrei Onea's avatar Andrei Onea Committed by Andrei-Valentin Onea
Browse files

Switch to ConcurrentHashMap for CompatConfig

Use ConcurrentHashMap instead of a SparseLongArray guarded by a
reentrant readwrite lock to make CompatConfig.isChangeEnabled as fast as
possible.

Test: atest CompatConfigTest
Bug: 197712476
Bug: 191398285
Change-Id: I498c439baf3e060ec7feb68ed581ca680e2ebcad
Merged-In: 498c439baf3e060ec7feb68ed581ca680e2ebcad
(cherry picked from commit 42090b95)
parent 2a15391a
Loading
Loading
Loading
Loading
+25 −46
Original line number Diff line number Diff line
@@ -36,9 +36,9 @@ import com.android.server.compat.overrides.ChangeOverrides;
import com.android.server.compat.overrides.OverrideValue;
import com.android.server.compat.overrides.RawOverrideValue;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Represents the state of a single compatibility change.
@@ -82,8 +82,8 @@ public final class CompatChange extends CompatibilityChangeInfo {

    ChangeListener mListener = null;

    private Map<String, Boolean> mEvaluatedOverrides;
    private Map<String, PackageOverride> mRawOverrides;
    private ConcurrentHashMap<String, Boolean> mEvaluatedOverrides;
    private ConcurrentHashMap<String, PackageOverride> mRawOverrides;

    public CompatChange(long changeId) {
        this(changeId, null, -1, -1, false, false, null, false);
@@ -114,11 +114,11 @@ public final class CompatChange extends CompatibilityChangeInfo {
              description, overridable);

        // Initialize override maps.
        mEvaluatedOverrides = new HashMap<>();
        mRawOverrides = new HashMap<>();
        mEvaluatedOverrides = new ConcurrentHashMap<>();
        mRawOverrides = new ConcurrentHashMap<>();
    }

    void registerListener(ChangeListener listener) {
    synchronized void registerListener(ChangeListener listener) {
        if (mListener != null) {
            throw new IllegalStateException(
                    "Listener for change " + toString() + " already registered.");
@@ -131,8 +131,6 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * Force the enabled state of this change for a given package name. The change will only take
     * effect after that packages process is killed and restarted.
     *
     * <p>Note, this method is not thread safe so callers must ensure thread safety.
     *
     * @param pname Package name to enable the change for.
     * @param enabled Whether or not to enable the change.
     */
@@ -155,14 +153,12 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * Tentatively set the state of this change for a given package name.
     * The override will only take effect after that package is installed, if applicable.
     *
     * <p>Note, this method is not thread safe so callers must ensure thread safety.
     *
     * @param packageName Package name to tentatively enable the change for.
     * @param override The package override to be set
     * @param allowedState Whether the override is allowed.
     * @param versionCode The version code of the package.
     */
    void addPackageOverride(String packageName, PackageOverride override,
    synchronized void addPackageOverride(String packageName, PackageOverride override,
            OverrideAllowedState allowedState, @Nullable Long versionCode) {
        if (getLoggingOnly()) {
            throw new IllegalArgumentException(
@@ -185,12 +181,12 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * @return {@code true} if the recheck yielded a result that requires invalidating caches
     *         (a deferred override was consolidated or a regular override was removed).
     */
    boolean recheckOverride(String packageName, OverrideAllowedState allowedState,
    synchronized boolean recheckOverride(String packageName, OverrideAllowedState allowedState,
            @Nullable Long versionCode) {
        boolean allowed = (allowedState.state == OverrideAllowedState.ALLOWED);

        // If the app is not installed or no longer has raw overrides, evaluate to false
        if (versionCode == null || !hasRawOverride(packageName) || !allowed) {
        if (versionCode == null || !mRawOverrides.containsKey(packageName) || !allowed) {
            removePackageOverrideInternal(packageName);
            return false;
        }
@@ -211,10 +207,6 @@ public final class CompatChange extends CompatibilityChangeInfo {
        return true;
    }

    boolean hasPackageOverride(String pname) {
        return mRawOverrides.containsKey(pname);
    }

    /**
     * Remove any package override for the given package name, restoring the default behaviour.
     *
@@ -224,9 +216,11 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * @param allowedState Whether the override is allowed.
     * @param versionCode The version code of the package.
     */
    boolean removePackageOverride(String pname, OverrideAllowedState allowedState,
    synchronized boolean removePackageOverride(String pname, OverrideAllowedState allowedState,
            @Nullable Long versionCode) {
        if (mRawOverrides.remove(pname) != null) {
        if (mRawOverrides.containsKey(pname)) {
            allowedState.enforce(getId(), pname);
            mRawOverrides.remove(pname);
            recheckOverride(pname, allowedState, versionCode);
            return true;
        }
@@ -244,8 +238,11 @@ public final class CompatChange extends CompatibilityChangeInfo {
        if (app == null) {
            return defaultValue();
        }
        if (mEvaluatedOverrides.containsKey(app.packageName)) {
            return mEvaluatedOverrides.get(app.packageName);
        if (app.packageName != null) {
            final Boolean enabled = mEvaluatedOverrides.get(app.packageName);
            if (enabled != null) {
                return enabled;
            }
        }
        if (getDisabled()) {
            return false;
@@ -269,9 +266,9 @@ public final class CompatChange extends CompatibilityChangeInfo {
     * @return {@code true} if the change should be enabled for the package.
     */
    boolean willBeEnabled(String packageName) {
        if (hasRawOverride(packageName)) {
            int eval = mRawOverrides.get(packageName).evaluateForAllVersions();
            switch (eval) {
        final PackageOverride override = mRawOverrides.get(packageName);
        if (override != null) {
            switch (override.evaluateForAllVersions()) {
                case VALUE_ENABLED:
                    return true;
                case VALUE_DISABLED:
@@ -292,30 +289,12 @@ public final class CompatChange extends CompatibilityChangeInfo {
        return !getDisabled();
    }

    /**
     * Checks whether a change has an override for a package.
     * @param packageName name of the package
     * @return true if there is such override
     */
    private boolean hasOverride(String packageName) {
        return mEvaluatedOverrides.containsKey(packageName);
    }

    /**
     * Checks whether a change has a deferred override for a package.
     * @param packageName name of the package
     * @return true if there is such a deferred override
     */
    private boolean hasRawOverride(String packageName) {
        return mRawOverrides.containsKey(packageName);
    }

    void clearOverrides() {
    synchronized void clearOverrides() {
        mRawOverrides.clear();
        mEvaluatedOverrides.clear();
    }

    void loadOverrides(ChangeOverrides changeOverrides) {
    synchronized void loadOverrides(ChangeOverrides changeOverrides) {
        // Load deferred overrides for backwards compatibility
        if (changeOverrides.getDeferred() != null) {
            for (OverrideValue override : changeOverrides.getDeferred().getOverrideValue()) {
@@ -348,7 +327,7 @@ public final class CompatChange extends CompatibilityChangeInfo {
        }
    }

    ChangeOverrides saveOverrides() {
    synchronized ChangeOverrides saveOverrides() {
        if (mRawOverrides.isEmpty()) {
            return null;
        }
@@ -406,7 +385,7 @@ public final class CompatChange extends CompatibilityChangeInfo {
        return sb.append(")").toString();
    }

    private void notifyListener(String packageName) {
    private synchronized void notifyListener(String packageName) {
        if (mListener != null) {
            mListener.onCompatChange(packageName);
        }
+135 −252

File changed.

Preview size limit exceeded, changes collapsed.