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

Commit eceb80d2 authored by Song Chun Fan's avatar Song Chun Fan Committed by Android (Google) Code Review
Browse files

Merge "[pm] Guard concurrent modifications of mRunningInstalls" into main

parents c2af6ac6 3a5ae97d
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -849,7 +849,9 @@ final class InstallPackageHelper {
        int token;
        if (mPm.mNextInstallToken < 0) mPm.mNextInstallToken = 1;
        token = mPm.mNextInstallToken++;
        synchronized (mPm.mRunningInstalls) {
            mPm.mRunningInstalls.put(token, request);
        }

        if (DEBUG_INSTALL) Log.v(TAG, "+ starting restore round-trip " + token);

+12 −6
Original line number Diff line number Diff line
@@ -82,14 +82,20 @@ final class PackageHandler extends Handler {
            case POST_INSTALL: {
                if (DEBUG_INSTALL) Log.v(TAG, "Handling post-install for " + msg.arg1);

                InstallRequest request = mPm.mRunningInstalls.get(msg.arg1);
                final boolean didRestore = (msg.arg2 != 0);
                mPm.mRunningInstalls.delete(msg.arg1);
                final InstallRequest request;
                final int token;
                final boolean didRestore;
                synchronized (mPm.mRunningInstalls) {
                    request= mPm.mRunningInstalls.get(msg.arg1);
                    token = msg.arg1;
                    didRestore = (msg.arg2 != 0);
                    mPm.mRunningInstalls.delete(token);
                }

                if (request == null) {
                    if (DEBUG_INSTALL) {
                        Slog.i(TAG, "InstallRequest is null. Nothing to do for post-install "
                                + "token " + msg.arg1);
                                + "token " + token);
                    }
                    break;
                }
@@ -100,10 +106,10 @@ final class PackageHandler extends Handler {
                    mPm.handlePackagePostInstall(request, didRestore);
                } else if (DEBUG_INSTALL) {
                    // No post-install when we run restore from installExistingPackageForUser
                    Slog.i(TAG, "Nothing to do for post-install token " + msg.arg1);
                    Slog.i(TAG, "Nothing to do for post-install token " + token);
                }

                Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", msg.arg1);
                Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "postInstall", token);
            } break;
            case DEFERRED_NO_KILL_POST_DELETE: {
                CleanUpArgs args = (CleanUpArgs) msg.obj;
+17 −13
Original line number Diff line number Diff line
@@ -960,6 +960,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
    // Stores a list of users whose package restrictions file needs to be updated
    final ArraySet<Integer> mDirtyUsers = new ArraySet<>();

    @GuardedBy("mRunningInstalls")
    final SparseArray<InstallRequest> mRunningInstalls = new SparseArray<>();
    int mNextInstallToken = 1;  // nonzero; will be wrapped back to 1 when ++ overflows

@@ -3291,15 +3292,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        // and been launched through some other means, so it is not in a problematic
        // state for observers to see the FIRST_LAUNCH signal.
        mHandler.post(() -> {
            synchronized (mRunningInstalls) {
                for (int i = 0; i < mRunningInstalls.size(); i++) {
                    final InstallRequest installRequest = mRunningInstalls.valueAt(i);
                    if (installRequest.getReturnCode() != PackageManager.INSTALL_SUCCEEDED) {
                        continue;
                    }
                    final int[] newUsers = installRequest.getNewUsers();
                    if (packageName.equals(installRequest.getPkg().getPackageName())) {
                        // right package; but is it for the right user?
                    for (int uIndex = 0; uIndex < installRequest.getNewUsers().length; uIndex++) {
                        if (userId == installRequest.getNewUsers()[uIndex]) {
                        for (int uIndex = 0; uIndex < newUsers.length; uIndex++) {
                            if (userId == newUsers[uIndex]) {
                                if (DEBUG_BACKUP) {
                                    Slog.i(TAG, "Package " + packageName
                                            + " being restored so deferring FIRST_LAUNCH");
@@ -3309,6 +3312,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                        }
                    }
                }
            }
            // didn't find it, so not being restored
            if (DEBUG_BACKUP) {
                Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH");