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

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

Merge "[pm] unlock mInstallLock before dexopt" into main

parents e08bd659 700b8f1d
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -985,13 +985,13 @@ final class InstallPackageHelper {
    }

    void installPackagesTraced(List<InstallRequest> requests) {
        synchronized (mPm.mInstallLock) {
        mPm.mInstallLock.lock();
        try {
            Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "installPackages");
            installPackagesLI(requests);
        } finally {
            Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
            }
            mPm.mInstallLock.unlock();
        }
    }

@@ -2590,22 +2590,30 @@ final class InstallPackageHelper {
            final boolean performDexopt = DexOptHelper.shouldPerformDexopt(installRequest,
                    dexoptOptions, mContext);
            if (performDexopt) {
                // dexopt can take long, and ArtService doesn't require installd, so we release
                // the lock here and re-acquire the lock after dexopt is finished.
                mPm.mInstallLock.unlock();
                try {
                    Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt");

                // This mirrors logic from commitReconciledScanResultLocked, where the library files
                // needed for dexopt are assigned.
                    // This mirrors logic from commitReconciledScanResultLocked, where the library
                    // files needed for dexopt are assigned.
                    PackageSetting realPkgSetting = installRequest.getRealPackageSetting();

                // Unfortunately, the updated system app flag is only tracked on this PackageSetting
                    // Unfortunately, the updated system app flag is only tracked on this
                    // PackageSetting
                    boolean isUpdatedSystemApp =
                            installRequest.getScannedPackageSetting().isUpdatedSystemApp();

                    realPkgSetting.getPkgState().setUpdatedSystemApp(isUpdatedSystemApp);

                DexoptResult dexOptResult =
                        DexOptHelper.dexoptPackageUsingArtService(installRequest, dexoptOptions);
                    DexoptResult dexOptResult = DexOptHelper.dexoptPackageUsingArtService(
                            installRequest, dexoptOptions);
                    installRequest.onDexoptFinished(dexOptResult);
                    Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
                } finally {
                    mPm.mInstallLock.lock();
                }
            }
        }
        PackageManagerServiceUtils.waitForNativeBinariesExtractionForIncremental(
+3 −3
Original line number Diff line number Diff line
@@ -626,7 +626,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
    // Lock for state used when installing and doing other long running
    // operations.  Methods that must be called with this lock held have
    // the suffix "LI".
    final Object mInstallLock;
    final PackageManagerTracedLock mInstallLock;

    // ----------------------------------------------------------------

@@ -1692,8 +1692,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        final TimingsTraceAndSlog t = new TimingsTraceAndSlog(TAG + "Timing",
                Trace.TRACE_TAG_PACKAGE_MANAGER);
        t.traceBegin("create package manager");
        final PackageManagerTracedLock lock = new PackageManagerTracedLock();
        final Object installLock = new Object();
        final PackageManagerTracedLock lock = new PackageManagerTracedLock("mLock");
        final PackageManagerTracedLock installLock = new PackageManagerTracedLock("mInstallLock");

        HandlerThread backgroundThread = new ServiceThread("PackageManagerBg",
                Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);
+3 −3
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public class PackageManagerServiceInjector {
    private final Context mContext;
    private final PackageManagerTracedLock mLock;
    private final Installer mInstaller;
    private final Object mInstallLock;
    private final PackageManagerTracedLock mInstallLock;
    private final Handler mBackgroundHandler;
    private final Executor mBackgroundExecutor;
    private final List<ScanPartition> mSystemPartitions;
@@ -144,7 +144,7 @@ public class PackageManagerServiceInjector {
    private final Singleton<PackageMonitorCallbackHelper> mPackageMonitorCallbackHelper;

    PackageManagerServiceInjector(Context context, PackageManagerTracedLock lock,
            Installer installer, Object installLock, PackageAbiHelper abiHelper,
            Installer installer, PackageManagerTracedLock installLock, PackageAbiHelper abiHelper,
            Handler backgroundHandler,
            List<ScanPartition> systemPartitions,
            Producer<ComponentResolver> componentResolverProducer,
@@ -254,7 +254,7 @@ public class PackageManagerServiceInjector {
        return mAbiHelper;
    }

    public Object getInstallLock() {
    public PackageManagerTracedLock getInstallLock() {
        return mInstallLock;
    }

+30 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.server.pm;

import android.annotation.Nullable;
import android.util.Slog;

import java.util.concurrent.locks.ReentrantLock;

/**
@@ -23,4 +26,31 @@ import java.util.concurrent.locks.ReentrantLock;
 * injection, similar to {@link ActivityManagerGlobalLock}.
 */
public class PackageManagerTracedLock extends ReentrantLock {
    private static final String TAG = "PackageManagerTracedLock";
    private static final boolean DEBUG = false;
    @Nullable private final String mLockName;

    public PackageManagerTracedLock(@Nullable String lockName) {
        mLockName = lockName;
    }

    public PackageManagerTracedLock() {
        this(null);
    }

    @Override
    public void lock() {
        super.lock();
        if (DEBUG && mLockName != null) {
            Slog.i(TAG, "locked " + mLockName);
        }
    }

    @Override
    public void unlock() {
        super.unlock();
        if (DEBUG && mLockName != null) {
            Slog.i(TAG, "unlocked " + mLockName);
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -52,11 +52,11 @@ class UserDataPreparer {
    private static final String TAG = "UserDataPreparer";
    private static final String XATTR_SERIAL = "user.serial";

    private final Object mInstallLock;
    private final PackageManagerTracedLock mInstallLock;
    private final Context mContext;
    private final Installer mInstaller;

    UserDataPreparer(Installer installer, Object installLock, Context context) {
    UserDataPreparer(Installer installer, PackageManagerTracedLock installLock, Context context) {
        mInstallLock = installLock;
        mContext = context;
        mInstaller = installer;
Loading