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

Commit bab7c28e authored by Todd Kennedy's avatar Todd Kennedy Committed by Adam Seaton
Browse files

DO NOT MERGE ANYWHERE: 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 b78a9bc5
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();
    }