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

Commit 2b2011a8 authored by Suren Baghdasaryan's avatar Suren Baghdasaryan
Browse files

Request lmkd to purge its list of pids after establishing connection



lmkd keeps a list of pids registered by ActivityManager, however on rare
occasions when framework restarts and lmkd survives that list has to be
purged. Request lmkd to clear its pid list immediately after establishing
connection to it.

Bug: 116801366
Test: locally by killing zygote process
Change-Id: Id8c81e0cb0c4cf03b8faa0add5a9514fd3cd0c0c
Signed-off-by: default avatarSuren Baghdasaryan <surenb@google.com>
parent 58d1ac47
Loading
Loading
Loading
Loading
+35 −18
Original line number Diff line number Diff line
@@ -162,9 +162,11 @@ public final class ProcessList {
    // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs)
    // LMK_PROCPRIO <pid> <uid> <prio>
    // LMK_PROCREMOVE <pid>
    // LMK_PROCPURGE
    static final byte LMK_TARGET = 0;
    static final byte LMK_PROCPRIO = 1;
    static final byte LMK_PROCREMOVE = 2;
    static final byte LMK_PROCPURGE = 3;

    // These are the various interesting memory levels that we will give to
    // the OOM killer.  Note that the OOM killer only supports 6 slots, so we
@@ -813,6 +815,24 @@ public final class ProcessList {
        return true;
    }

    // Never call directly, use writeLmkd() instead
    private static boolean writeLmkdCommand(ByteBuffer buf) {
        try {
            sLmkdOutputStream.write(buf.array(), 0, buf.position());
        } catch (IOException ex) {
            Slog.w(TAG, "Error writing to lowmemorykiller socket");

            try {
                sLmkdSocket.close();
            } catch (IOException ex2) {
            }

            sLmkdSocket = null;
            return false;
        }
        return true;
    }

    private static void writeLmkd(ByteBuffer buf) {

        for (int i = 0; i < 3; i++) {
@@ -824,20 +844,17 @@ public final class ProcessList {
                    }
                    continue;
                }
            }

            try {
                sLmkdOutputStream.write(buf.array(), 0, buf.position());
                return;
            } catch (IOException ex) {
                Slog.w(TAG, "Error writing to lowmemorykiller socket");

                try {
                    sLmkdSocket.close();
                } catch (IOException ex2) {
                // Purge any previously registered pids
                ByteBuffer purge_buf = ByteBuffer.allocate(4);
                purge_buf.putInt(LMK_PROCPURGE);
                if (writeLmkdCommand(purge_buf) == false) {
                    // Write failed, skip the rest and retry
                    continue;
                }

                sLmkdSocket = null;
            }
            if (writeLmkdCommand(buf)) {
                return;
            }
        }
    }