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

Commit 190819a3 authored by Winson's avatar Winson
Browse files

Remove some read only usages of PackageManagerService mLock

In most non-install, non-mutate areas, migrates away from locking
PackageManagerService directly in favor of the Computer snapshot.

This will relieve more lock contention and allow scoping
PackageSetting to mutate-only scenarios, such as install.

Bug: 202291449

Change-Id: Ie92ebfeacdc4a00484373f11739fdfe3c3897a7f
parent 8a17328a
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -663,6 +663,9 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP

    public abstract @Nullable PackageState getPackageState(@NonNull String packageName);

    @NonNull
    public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates();

    /**
     * Returns a package for the given UID. If the UID is part of a shared user ID, one
     * of the packages will be chosen to be returned.
@@ -909,7 +912,7 @@ public abstract class PackageManagerInternal implements PackageSettingsSnapshotP
     *               functionality of the other forEach methods, for eventual migration.
     * @param action action to be performed
     */
    public abstract void forEachPackageState(boolean locked, Consumer<PackageState> action);
    public abstract void forEachPackageState(boolean locked, Consumer<PackageStateInternal> action);

    /**
     * Perform the given action for each installed package for a user.
+5 −4
Original line number Diff line number Diff line
@@ -136,6 +136,7 @@ import com.android.server.am.ActivityManagerService.ProcessChangeItem;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.dex.DexManager;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.WindowManagerService;
import com.android.server.wm.WindowProcessController;
@@ -2296,13 +2297,13 @@ public final class ProcessList {
        Map<String, Pair<String, Long>> result = new ArrayMap<>(packages.length);
        int userId = UserHandle.getUserId(uid);
        for (String packageName : packages) {
            AndroidPackage androidPackage = pmInt.getPackage(packageName);
            if (androidPackage == null) {
            final PackageStateInternal packageState = pmInt.getPackageStateInternal(packageName);
            if (packageState == null) {
                Slog.w(TAG, "Unknown package:" + packageName);
                continue;
            }
            String volumeUuid = androidPackage.getVolumeUuid();
            long inode = pmInt.getCeDataInode(packageName, userId);
            String volumeUuid = packageState.getVolumeUuid();
            long inode = packageState.getUserStateOrDefault(userId).getCeDataInode();
            if (inode == 0) {
                Slog.w(TAG, packageName + " inode == 0 (b/152760674)");
                return null;
+10 −4
Original line number Diff line number Diff line
@@ -500,11 +500,17 @@ public class AppsFilter implements Watchable, Snappable {
                forcedQueryablePackageNames[i] = forcedQueryablePackageNames[i].intern();
            }
        }
        final StateProvider stateProvider = command -> {
            synchronized (injector.getLock()) {
                command.currentState(injector.getSettings().getPackagesLocked().untrackedStorage(),
        final StateProvider stateProvider = new StateProvider() {
            // TODO: This lock and its handling should be owned by AppsFilter
            private final Object mLock = new Object();

            @Override
            public void runWithState(CurrentStateCallback command) {
                synchronized (mLock) {
                    command.currentState(pms.getPackageStates(),
                            injector.getUserManagerInternal().getUserInfos());
                }
            }
        };
        AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig,
                forcedQueryablePackageNames, forceSystemAppsQueryable, null,
+350 −7

File changed.

Preview size limit exceeded, changes collapsed.

+2208 −48

File changed.

Preview size limit exceeded, changes collapsed.

Loading