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

Commit 2e72a828 authored by Rhed Jao's avatar Rhed Jao Committed by Android (Google) Code Review
Browse files

Merge "Add frozen counts support in PackageFreezer"

parents 0b071304 26899cdf
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -146,7 +146,6 @@ import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
import com.android.server.pm.verify.domain.DomainVerificationUtils;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedArraySet;
import com.android.server.utils.WatchedLongSparseArray;
import com.android.server.utils.WatchedSparseBooleanArray;
import com.android.server.utils.WatchedSparseIntArray;
@@ -333,7 +332,7 @@ public class ComputerEngine implements Computer {
    private final InstantAppRegistry mInstantAppRegistry;
    private final ApplicationInfo mLocalAndroidApplication;
    private final AppsFilter mAppsFilter;
    private final WatchedArraySet<String> mFrozenPackages;
    private final WatchedArrayMap<String, Integer> mFrozenPackages;

    // Immutable service attribute
    private final String mAppPredictionServicePackage;
@@ -3580,7 +3579,7 @@ public class ComputerEngine implements Computer {
            return PackageManagerService.PACKAGE_STARTABILITY_NOT_SYSTEM;
        }

        if (mFrozenPackages.contains(packageName)) {
        if (mFrozenPackages.containsKey(packageName)) {
            return PackageManagerService.PACKAGE_STARTABILITY_FROZEN;
        }

+3 −0
Original line number Diff line number Diff line
@@ -504,6 +504,9 @@ final class DumpHelper {
                    ipw.println("(none)");
                } else {
                    for (int i = 0; i < mPm.mFrozenPackages.size(); i++) {
                        ipw.print("package=");
                        ipw.print(mPm.mFrozenPackages.keyAt(i));
                        ipw.print(", refCounts=");
                        ipw.println(mPm.mFrozenPackages.valueAt(i));
                    }
                }
+3 −1
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ public final class MovePackageHelper {
                        "Device admin cannot be moved");
            }

            if (mPm.mFrozenPackages.contains(packageName)) {
            if (mPm.mFrozenPackages.containsKey(packageName)) {
                throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
                        "Failed to move already frozen package");
            }
@@ -188,6 +188,7 @@ public final class MovePackageHelper {
            for (int userId : installedUserIds) {
                if (StorageManager.isFileEncryptedNativeOrEmulated()
                        && !StorageManager.isUserKeyUnlocked(userId)) {
                    freezer.close();
                    throw new PackageManagerException(MOVE_FAILED_LOCKED_USER,
                            "User " + userId + " must be unlocked");
                }
@@ -230,6 +231,7 @@ public final class MovePackageHelper {
        final IPackageInstallObserver2 installObserver = new IPackageInstallObserver2.Stub() {
            @Override
            public void onUserActionRequired(Intent intent) throws RemoteException {
                freezer.close();
                throw new IllegalStateException();
            }

+9 −5
Original line number Diff line number Diff line
@@ -31,8 +31,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
final class PackageFreezer implements AutoCloseable {
    private final String mPackageName;

    private final boolean mWeFroze;

    private final AtomicBoolean mClosed = new AtomicBoolean();
    private final CloseGuard mCloseGuard = CloseGuard.get();

@@ -48,7 +46,7 @@ final class PackageFreezer implements AutoCloseable {
    PackageFreezer(PackageManagerService pm) {
        mPm = pm;
        mPackageName = null;
        mWeFroze = false;
        mClosed.set(true);
        mCloseGuard.open("close");
    }

@@ -58,7 +56,9 @@ final class PackageFreezer implements AutoCloseable {
        mPackageName = packageName;
        final PackageSetting ps;
        synchronized (mPm.mLock) {
            mWeFroze = mPm.mFrozenPackages.add(mPackageName);
            final int refCounts = mPm.mFrozenPackages
                    .getOrDefault(mPackageName, 0 /* defaultValue */) + 1;
            mPm.mFrozenPackages.put(mPackageName, refCounts);
            ps = mPm.mSettings.getPackageLPr(mPackageName);
        }
        if (ps != null) {
@@ -82,7 +82,11 @@ final class PackageFreezer implements AutoCloseable {
        mCloseGuard.close();
        if (mClosed.compareAndSet(false, true)) {
            synchronized (mPm.mLock) {
                if (mWeFroze) {
                final int refCounts = mPm.mFrozenPackages
                        .getOrDefault(mPackageName, 0 /* defaultValue */) - 1;
                if (refCounts > 0) {
                    mPm.mFrozenPackages.put(mPackageName, refCounts);
                } else {
                    mPm.mFrozenPackages.remove(mPackageName);
                }
            }
+8 −8
Original line number Diff line number Diff line
@@ -249,7 +249,6 @@ import com.android.server.utils.TimingsTraceAndSlog;
import com.android.server.utils.Watchable;
import com.android.server.utils.Watched;
import com.android.server.utils.WatchedArrayMap;
import com.android.server.utils.WatchedArraySet;
import com.android.server.utils.WatchedLongSparseArray;
import com.android.server.utils.WatchedSparseBooleanArray;
import com.android.server.utils.WatchedSparseIntArray;
@@ -646,15 +645,16 @@ public class PackageManagerService extends IPackageManager.Stub
    final Settings mSettings;

    /**
     * Set of package names that are currently "frozen", which means active
     * surgery is being done on the code/data for that package. The platform
     * will refuse to launch frozen packages to avoid race conditions.
     * Map of package names to frozen counts that are currently "frozen",
     * which means active surgery is being done on the code/data for that
     * package. The platform will refuse to launch frozen packages to avoid
     * race conditions.
     *
     * @see PackageFreezer
     */
    @GuardedBy("mLock")
    final WatchedArraySet<String> mFrozenPackages = new WatchedArraySet<>();
    private final SnapshotCache<WatchedArraySet<String>> mFrozenPackagesSnapshot =
    final WatchedArrayMap<String, Integer> mFrozenPackages = new WatchedArrayMap<>();
    private final SnapshotCache<WatchedArrayMap<String, Integer>> mFrozenPackagesSnapshot =
            new SnapshotCache.Auto(mFrozenPackages, mFrozenPackages,
                    "PackageManagerService.mFrozenPackages");

@@ -1016,7 +1016,7 @@ public class PackageManagerService extends IPackageManager.Stub
        public final AppsFilter appsFilter;
        public final ComponentResolver componentResolver;
        public final PackageManagerService service;
        public final WatchedArraySet<String> frozenPackages;
        public final WatchedArrayMap<String, Integer> frozenPackages;

        Snapshot(int type) {
            if (type == Snapshot.SNAPPED) {
@@ -7255,7 +7255,7 @@ public class PackageManagerService extends IPackageManager.Stub
     */
    void checkPackageFrozen(String packageName) {
        synchronized (mLock) {
            if (!mFrozenPackages.contains(packageName)) {
            if (!mFrozenPackages.containsKey(packageName)) {
                Slog.wtf(TAG, "Expected " + packageName + " to be frozen!", new Throwable());
            }
        }
Loading