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

Commit 44fe7fcb authored by Lee Shombert's avatar Lee Shombert Committed by Android (Google) Code Review
Browse files

Merge "Clean up hasSystemFeature binder cache"

parents 981f524a 89608118
Loading
Loading
Loading
Loading
+25 −31
Original line number Diff line number Diff line
@@ -618,36 +618,22 @@ public class ApplicationPackageManager extends PackageManager {
        return hasSystemFeature(name, 0);
    }

    private boolean hasSystemFeatureUncached(String name, int version) {
        try {
            return mPM.hasSystemFeature(name, version);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    // Make this cache relatively large.  There are many system features and
    // none are ever invalidated.  MPTS tests suggests that the cache should
    // hold at least 150 entries.
    private static final int SYS_FEATURE_CACHE_SIZE = 256;
    private static final String CACHE_KEY_SYS_FEATURE_PROPERTY = "cache_key.has_system_feature";

    private class SystemFeatureQuery {
    private class HasSystemFeatureQuery {
        public final String name;
        public final int version;
        public SystemFeatureQuery(String n, int v) {
        public HasSystemFeatureQuery(String n, int v) {
            name = n;
            version = v;
        }
        @Override
        public String toString() {
            return String.format("SystemFeatureQuery(name=\"%s\", version=%d)",
            return String.format("HasSystemFeatureQuery(name=\"%s\", version=%d)",
                    name, version);
        }
        @Override
        public boolean equals(Object o) {
            if (o instanceof SystemFeatureQuery) {
                SystemFeatureQuery r = (SystemFeatureQuery) o;
            if (o instanceof HasSystemFeatureQuery) {
                HasSystemFeatureQuery r = (HasSystemFeatureQuery) o;
                return Objects.equals(name, r.name) &&  version == r.version;
            } else {
                return false;
@@ -655,33 +641,41 @@ public class ApplicationPackageManager extends PackageManager {
        }
        @Override
        public int hashCode() {
            return Objects.hashCode(name) + version;
            return Objects.hashCode(name) * 13 + version;
        }
    }

    private final PropertyInvalidatedCache<SystemFeatureQuery, Boolean> mSysFeatureCache =
            new PropertyInvalidatedCache<SystemFeatureQuery, Boolean>(
                SYS_FEATURE_CACHE_SIZE,
                CACHE_KEY_SYS_FEATURE_PROPERTY) {
    // Make this cache relatively large.  There are many system features and
    // none are ever invalidated.  MPTS tests suggests that the cache should
    // hold at least 150 entries.
    private final static PropertyInvalidatedCache<HasSystemFeatureQuery, Boolean>
            mHasSystemFeatureCache =
            new PropertyInvalidatedCache<HasSystemFeatureQuery, Boolean>(
                256, "cache_key.has_system_feature") {
                @Override
                protected Boolean recompute(SystemFeatureQuery query) {
                    return hasSystemFeatureUncached(query.name, query.version);
                protected Boolean recompute(HasSystemFeatureQuery query) {
                    try {
                        return ActivityThread.currentActivityThread().getPackageManager().
                            hasSystemFeature(query.name, query.version);
                    } catch (RemoteException e) {
                        throw e.rethrowFromSystemServer();
                    }
                }
            };

    @Override
    public boolean hasSystemFeature(String name, int version) {
        return mSysFeatureCache.query(new SystemFeatureQuery(name, version)).booleanValue();
        return mHasSystemFeatureCache.query(new HasSystemFeatureQuery(name, version));
    }

    /** @hide */
    public void disableSysFeatureCache() {
        mSysFeatureCache.disableLocal();
    public void disableHasSystemFeatureCache() {
        mHasSystemFeatureCache.disableLocal();
    }

    /** @hide */
    public static void invalidateSysFeatureCache() {
        PropertyInvalidatedCache.invalidateCache(CACHE_KEY_SYS_FEATURE_PROPERTY);
    public static void invalidateHasSystemFeatureCache() {
        mHasSystemFeatureCache.invalidateCache();
    }

    @Override
+1 −1
Original line number Diff line number Diff line
@@ -2728,7 +2728,7 @@ public class PackageManagerService extends IPackageManager.Stub
        t.traceBegin("get system config");
        SystemConfig systemConfig = SystemConfig.getInstance();
        mAvailableFeatures = systemConfig.getAvailableFeatures();
        ApplicationPackageManager.invalidateSysFeatureCache();
        ApplicationPackageManager.invalidateHasSystemFeatureCache();
        t.traceEnd();
        mProtectedPackages = new ProtectedPackages(mContext);