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

Commit 8f7fc041 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Avoid fatal crashes during power stats aggregation

Bug: 393728925
Test: atest PowerStatsTests
Flag: EXEMPT bug fix
Change-Id: I47232144e300e03e9712cff00285e6d6c7fd110c
parent dedeb1e8
Loading
Loading
Loading
Loading
+108 −95
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.power.stats.processor;
import android.annotation.NonNull;
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.util.Slog;
import android.util.SparseBooleanArray;

import com.android.internal.annotations.VisibleForTesting;
@@ -33,6 +34,7 @@ import java.util.function.Consumer;
 * {@link AggregatedPowerStats} that adds up power stats from the samples found in battery history.
 */
public class PowerStatsAggregator {
    private static final String TAG = "PowerStatsAggregator";
    private static final long UNINITIALIZED = -1;
    private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig;
    private final SparseBooleanArray mEnabledComponents =
@@ -81,7 +83,19 @@ public class PowerStatsAggregator {
     */
    public void aggregatePowerStats(BatteryStatsHistory history, long startTimeMs, long endTimeMs,
            Consumer<AggregatedPowerStats> consumer) {
        try {
            synchronized (this) {
                aggregatePowerStatsLocked(history, startTimeMs, endTimeMs, consumer);
            }
        } catch (Exception e) {
            Slog.e(TAG, "Cannot perform power stats aggregation"
                    + " because battery stats history may be corrupted", e);
            history.reset();
        }
    }

    private void aggregatePowerStatsLocked(BatteryStatsHistory history, long startTimeMs,
            long endTimeMs, Consumer<AggregatedPowerStats> consumer) {
        if (mStats == null) {
            mStats = new AggregatedPowerStats(mAggregatedPowerStatsConfig, mEnabledComponents);
        }
@@ -192,7 +206,6 @@ public class PowerStatsAggregator {

        mStats.reset();     // to free up memory
    }
    }

    /**
     * Reset to prepare for a new aggregation session.