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

Commit 275ea423 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Clean up codes holding mInstallLock in PackageParserCallback" into pi-dev

parents 223c864b 540f7adf
Loading
Loading
Loading
Loading
+16 −23
Original line number Diff line number Diff line
@@ -808,7 +808,7 @@ public class PackageManagerService extends IPackageManager.Stub
        }
        final String[] getStaticOverlayPaths(List<PackageParser.Package> overlayPackages,
                String targetPath, Object installLock) {
                String targetPath) {
            if (overlayPackages == null || overlayPackages.isEmpty()) {
                return null;
            }
@@ -828,20 +828,9 @@ public class PackageManagerService extends IPackageManager.Stub
                    //
                    // OverlayManagerService will update each of them with a correct gid from its
                    // target package app id.
                    if (installLock != null) {
                        synchronized (installLock) {
                    mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                            UserHandle.getSharedAppGid(
                                    UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
                        }
                    } else {
                        // We can call mInstaller without holding mInstallLock because mInstallLock
                        // is held before running parallel parsing.
                        // Moreover holding mInstallLock on each parsing thread causes dead-lock.
                        mInstaller.idmap(targetPath, overlayPackage.baseCodePath,
                                UserHandle.getSharedAppGid(
                                        UserHandle.getUserGid(UserHandle.USER_SYSTEM)));
                    }
                    if (overlayPathList == null) {
                        overlayPathList = new ArrayList<String>();
                    }
@@ -856,13 +845,15 @@ public class PackageManagerService extends IPackageManager.Stub
        String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
            List<PackageParser.Package> overlayPackages;
            synchronized (mInstallLock) {
                synchronized (mPackages) {
                    overlayPackages = getStaticOverlayPackages(
                            mPackages.values(), targetPackageName);
                }
                // It is safe to keep overlayPackages without holding mPackages because static overlay
                // packages can't be uninstalled or disabled.
            return getStaticOverlayPaths(overlayPackages, targetPath, mInstallLock);
                return getStaticOverlayPaths(overlayPackages, targetPath);
            }
        }
        @Override public final String[] getOverlayApks(String targetPackageName) {
@@ -895,11 +886,13 @@ public class PackageManagerService extends IPackageManager.Stub
        synchronized String[] getStaticOverlayPaths(String targetPackageName, String targetPath) {
            // We can trust mOverlayPackages without holding mPackages because package uninstall
            // can't happen while running parallel parsing.
            // Moreover holding mPackages on each parsing thread causes dead-lock.
            // And we can call mInstaller inside getStaticOverlayPaths without holding mInstallLock
            // because mInstallLock is held before running parallel parsing.
            // Moreover holding mPackages or mInstallLock on each parsing thread causes dead-lock.
            return mOverlayPackages == null ? null :
                    getStaticOverlayPaths(
                            getStaticOverlayPackages(mOverlayPackages, targetPackageName),
                            targetPath, null);
                            targetPath);
        }
    }