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

Commit 36e74a49 authored by Jahdiel Alvarez's avatar Jahdiel Alvarez
Browse files

Add criticalLowMemory trace to LowMemDetector

Added a "criticalLowMemory" trace which tracks the duration of high
memory pressure state. When the native PSI monitor detects a memory PSI
event where the pressure state is ADJ_MEM_FACTOR_CRITICAL (highest
memory PSI level), we start tracing until the next PSI event is
detected.

Test: atest CtsAppTestCases:ActivityManagerTest
Bug: 306202359
Change-Id: I00acc9de180f3e65a9fe2cf84028a0c9eb66a008
parent a8c34f8d
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_NOR
import static com.android.internal.app.procstats.ProcessStats.ADJ_NOTHING;

import android.annotation.IntDef;
import android.os.Trace;

import com.android.internal.annotations.GuardedBy;

@@ -90,17 +91,31 @@ public final class LowMemDetector {
    private native int waitForPressure();

    private final class LowMemThread extends Thread {
        private boolean mIsTracingMemCriticalLow;

        LowMemThread() {
            super("LowMemThread");
        }

        public void run() {

            while (true) {
                // sleep waiting for a PSI event
                int newPressureState = waitForPressure();
                // PSI event detected
                boolean isCriticalLowMemory = newPressureState == ADJ_MEM_FACTOR_CRITICAL;
                if (isCriticalLowMemory && !mIsTracingMemCriticalLow) {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "criticalLowMemory");
                } else if (!isCriticalLowMemory && mIsTracingMemCriticalLow) {
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                }
                mIsTracingMemCriticalLow = isCriticalLowMemory;
                if (newPressureState == -1) {
                    // epoll broke, tear this down
                    mAvailable = false;
                    break;
                }
                // got a PSI event? let's update lowmem info
                // got an actual PSI event? let's update lowmem info
                synchronized (mPressureStateLock) {
                    mPressureState = newPressureState;
                }