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

Commit 94f9be2e authored by Todd Kennedy's avatar Todd Kennedy Committed by Andreas Gampe
Browse files

Release mPackages lock earlier

We cannot hold mPackages when calling into generatePackageDexopts().
This method takes Package Manager's mInstallLock. By holding mPackages,
we have lock inversion and hilarity ensues.

Change-Id: Ia11a158677051e3511702f38cde6780e75b256fb
Fixes: 30927731
(cherry picked from commit a8d4f489)
parent 3f95d0bb
Loading
Loading
Loading
Loading
+23 −22
Original line number Diff line number Diff line
@@ -93,17 +93,19 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
        if (mDexoptCommands != null) {
            throw new IllegalStateException("already called prepare()");
        }
        final List<PackageParser.Package> important;
        final List<PackageParser.Package> others;
        synchronized (mPackageManagerService.mPackages) {
            // Important: the packages we need to run with ab-ota compiler-reason.
            List<PackageParser.Package> important = PackageManagerServiceUtils.getPackagesForDexopt(
            important = PackageManagerServiceUtils.getPackagesForDexopt(
                    mPackageManagerService.mPackages.values(), mPackageManagerService);
            // Others: we should optimize this with the (first-)boot compiler-reason.
            List<PackageParser.Package> others =
                    new ArrayList<>(mPackageManagerService.mPackages.values());
            others = new ArrayList<>(mPackageManagerService.mPackages.values());
            others.removeAll(important);

            // Pre-size the array list by over-allocating by a factor of 1.5.
            mDexoptCommands = new ArrayList<>(3 * mPackageManagerService.mPackages.size() / 2);
        }

        for (PackageParser.Package p : important) {
            // Make sure that core apps are optimized according to their own "reason".
@@ -125,7 +127,6 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
            mDexoptCommands.addAll(
                    generatePackageDexopts(p, PackageManagerService.REASON_FIRST_BOOT));
        }
        }
        completeSize = mDexoptCommands.size();
    }