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

Commit d23af5ed authored by Andrei Onea's avatar Andrei Onea
Browse files

Attempt to fix deadlock on saveOverrides

Currently, the lock on mChanges is held continuously while saving the
changes to disk, however if the serialization triggers an OomAdjustLSP,
that triggers yet another call to the compat framework - causing a
deadlock.
Currently, OomAdjust happens during XML serialisation, so releasing the
lock after we've collected all the data should fix the deadlock, however
there could be issues if OomAdjust happens while collecting the
overrides themselves. That seems somewhat unlikely, and would likely
signal a larger issue.

Test: atest CompatConfigTest
Bug: 190611974
Change-Id: I01e4802baeecf2757044609b91b7b7a40e728d4e
parent 3d44d6ed
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -257,8 +257,8 @@ final class CompatConfig {
                addChange(c);
            }
            c.addPackageOverride(packageName, overrides, allowedState, versionCode);
            invalidateCache();
        }
        invalidateCache();
        return alreadyKnown;
    }

@@ -379,10 +379,10 @@ final class CompatConfig {
                CompatChange change = mChanges.valueAt(i);
                removeOverrideUnsafe(change, packageName, versionCode);
            }
        }
        saveOverrides();
        invalidateCache();
    }
    }

    /**
     * Removes overrides whose change ID is specified in {@code overridesToRemove} that were
@@ -626,7 +626,18 @@ final class CompatConfig {
        if (mOverridesFile == null) {
            return;
        }
        Overrides overrides = new Overrides();
        synchronized (mChanges) {
            List<ChangeOverrides> changeOverridesList = overrides.getChangeOverrides();
            for (int idx = 0; idx < mChanges.size(); ++idx) {
                CompatChange c = mChanges.valueAt(idx);
                ChangeOverrides changeOverrides = c.saveOverrides();
                if (changeOverrides != null) {
                    changeOverridesList.add(changeOverrides);
                }
            }
        }
        synchronized (mOverridesFile) {
            // Create the file if it doesn't already exist
            try {
                mOverridesFile.createNewFile();
@@ -636,15 +647,6 @@ final class CompatConfig {
            }
            try (PrintWriter out = new PrintWriter(mOverridesFile)) {
                XmlWriter writer = new XmlWriter(out);
                Overrides overrides = new Overrides();
                List<ChangeOverrides> changeOverridesList = overrides.getChangeOverrides();
                for (int idx = 0; idx < mChanges.size(); ++idx) {
                    CompatChange c = mChanges.valueAt(idx);
                    ChangeOverrides changeOverrides = c.saveOverrides();
                    if (changeOverrides != null) {
                        changeOverridesList.add(changeOverrides);
                    }
                }
                XmlWriter.write(writer, overrides);
            } catch (IOException e) {
                Slog.e(TAG, e.toString());