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

Commit 495128ff authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix deadlock between PMS and UMS threads" into main

parents 59bb7b7e a62c25ab
Loading
Loading
Loading
Loading
+29 −13
Original line number Diff line number Diff line
@@ -169,6 +169,7 @@ import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.ExceptionUtils;
import android.util.IntArray;
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
@@ -4064,14 +4065,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService

        // packageName -> list of components to send broadcasts now
        final ArrayMap<String, ArrayList<String>> sendNowBroadcasts = new ArrayMap<>(targetSize);
        final List<PackageMetrics.ComponentStateMetrics> componentStateMetricsList =
                new ArrayList<PackageMetrics.ComponentStateMetrics>();
        final IntArray changedComponentIndices = new IntArray();
        boolean scheduleBroadcastMessage = false;
        boolean isSynchronous = false;
        synchronized (mLock) {

        Computer computer = snapshotComputer();
        boolean anyChanged = false;

        synchronized (mLock) {
            for (int i = 0; i < targetSize; i++) {
                if (!updateAllowed[i]) {
                    continue;
@@ -4080,18 +4080,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                final ComponentEnabledSetting setting = settings.get(i);
                final String packageName = setting.getPackageName();
                final PackageSetting packageSetting = pkgSettings.get(packageName);
                final PackageMetrics.ComponentStateMetrics componentStateMetrics =
                        new PackageMetrics.ComponentStateMetrics(setting,
                                UserHandle.getUid(userId, packageSetting.getAppId()),
                                setting.isComponent() ? computer.getComponentEnabledSettingInternal(
                                        setting.getComponentName(), callingUid, userId)
                                        : packageSetting.getEnabled(userId), callingUid);
                if (!setEnabledSettingInternalLocked(computer, packageSetting, setting, userId,
                        callingPackage)) {
                    continue;
                }

                anyChanged = true;
                componentStateMetricsList.add(componentStateMetrics);
                changedComponentIndices.add(i);

                if ((setting.getEnabledFlags() & PackageManager.SYNCHRONOUS) != 0) {
                    isSynchronous = true;
@@ -4144,6 +4139,27 @@ public class PackageManagerService implements PackageSender, TestUtilityService
            }
        }

        final List<PackageMetrics.ComponentStateMetrics> componentStateMetricsList =
                new ArrayList<PackageMetrics.ComponentStateMetrics>();
        final int listSize = changedComponentIndices.size();
        for (int i = 0; i < listSize; i++) {
            final int index = changedComponentIndices.get(i);
            final ComponentEnabledSetting setting = settings.get(index);
            final String packageName = setting.getPackageName();
            final PackageStateInternal psi = computer.getPackageStateInternal(packageName);
            // Gets component state from the old snapshot which was taken before the state change,
            // because the metrics want to use the old state
            final int componentOldState =
                    setting.isComponent() ? computer.getComponentEnabledSettingInternal(
                            setting.getComponentName(), callingUid, userId)
                            : psi.getUserStateOrDefault(userId).getEnabledState();
            final PackageMetrics.ComponentStateMetrics componentStateMetrics =
                    new PackageMetrics.ComponentStateMetrics(setting,
                            UserHandle.getUid(userId, psi.getAppId()),
                            componentOldState, callingUid);
            componentStateMetricsList.add(componentStateMetrics);
        }

        // Log the metrics when the component state is changed.
        PackageMetrics.reportComponentStateChanged(snapshotComputer(), componentStateMetricsList,
                userId);