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

Commit 91c11654 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Migrate PowerStatsLogger to Alarm based timing

This will increase the reliability of PowerStats logging for low cpu
uptime scenarios.

Flag: com.android.server.powerstats.alarm_based_powerstats_logging
Fixes: 294598168
Test: atest FrameworksServicesTests:PowerStatsServiceTest
Change-Id: Ifb623f544f729f948efce6ee3f8a5e503e576e94
parent 69c23d3e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ java_library_static {
        "connectivity_flags_lib",
        "dreams_flags_lib",
        "aconfig_new_storage_flags_lib",
        "powerstats_flags_lib",
    ],
    javac_shard_size: 50,
    javacflags: [
+11 −0
Original line number Diff line number Diff line
aconfig_declarations {
    name: "powerstats_flags",
    package: "com.android.server.powerstats",
    container: "system",
    srcs: ["*.aconfig"],
}

java_aconfig_library {
    name: "powerstats_flags_lib",
    aconfig_declarations: "powerstats_flags",
}
+35 −17
Original line number Diff line number Diff line
@@ -16,8 +16,10 @@

package com.android.server.powerstats;

import android.app.AlarmManager;
import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Slog;

/**
@@ -33,37 +35,53 @@ public final class TimerTrigger extends PowerStatsLogTrigger {
    private static final long LOG_PERIOD_MS_HIGH_FREQUENCY = 2 * 60 * 1000; // 2 minutes

    private final Handler mHandler;
    private final AlarmManager mAlarmManager;

    class PeriodicTimer implements Runnable, AlarmManager.OnAlarmListener {
        private final String mName;
        private final long mPeriodMs;
        private final int mMsgType;

        PeriodicTimer(String name, long periodMs, int msgType) {
            mName = name;
            mPeriodMs = periodMs;
            mMsgType = msgType;
        }

    private Runnable mLogDataLowFrequency = new Runnable() {
        @Override
        public void run() {
            // Do not wake the device for these messages.  Opportunistically log rail data every
            // LOG_PERIOD_MS_LOW_FREQUENCY.
            mHandler.postDelayed(mLogDataLowFrequency, LOG_PERIOD_MS_LOW_FREQUENCY);
            if (DEBUG) Slog.d(TAG, "Received delayed message.  Log rail data low frequency");
            logPowerStatsData(PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY);
        public void onAlarm() {
            run();
        }
    };

    private Runnable mLogDataHighFrequency = new Runnable() {
        @Override
        public void run() {
            // Do not wake the device for these messages.  Opportunistically log rail data every
            // LOG_PERIOD_MS_HIGH_FREQUENCY.
            mHandler.postDelayed(mLogDataHighFrequency, LOG_PERIOD_MS_HIGH_FREQUENCY);
            if (DEBUG) Slog.d(TAG, "Received delayed message.  Log rail data high frequency");
            logPowerStatsData(PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY);
            if (Flags.alarmBasedPowerstatsLogging()) {
                final long nextAlarmMs = SystemClock.elapsedRealtime() + mPeriodMs;
                mAlarmManager.set(AlarmManager.ELAPSED_REALTIME, nextAlarmMs,
                        AlarmManager.WINDOW_EXACT, 0, mName, this, mHandler, null);
            } else {
                mHandler.postDelayed(this, mPeriodMs);
            }
            if (DEBUG) Slog.d(TAG, "Received delayed message (" + mName + ").  Logging rail data");
            logPowerStatsData(mMsgType);
        }
    }
    };

    public TimerTrigger(Context context, PowerStatsLogger powerStatsLogger,
            boolean triggerEnabled) {
        super(context, powerStatsLogger);
        mHandler = mContext.getMainThreadHandler();
        mAlarmManager = mContext.getSystemService(AlarmManager.class);

        if (triggerEnabled) {
            mLogDataLowFrequency.run();
            mLogDataHighFrequency.run();
            final PeriodicTimer logDataLowFrequency = new PeriodicTimer("PowerStatsLowFreqLog",
                    LOG_PERIOD_MS_LOW_FREQUENCY,
                    PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_LOW_FREQUENCY);
            final PeriodicTimer logDataHighFrequency = new PeriodicTimer("PowerStatsHighFreqLog",
                    LOG_PERIOD_MS_HIGH_FREQUENCY,
                    PowerStatsLogger.MSG_LOG_TO_DATA_STORAGE_HIGH_FREQUENCY);
            logDataLowFrequency.run();
            logDataHighFrequency.run();
        }
    }
}
+13 −0
Original line number Diff line number Diff line

package: "com.android.server.powerstats"
container: "system"

flag {
    name: "alarm_based_powerstats_logging"
    namespace: "backstage_power"
    description: "Utilize new OomAdjuster implementation"
    bug: "294598168"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file