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

Commit 34eac9cf authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Prevent sharing of stateful PowerStatsProcessor objects

Bug: 359088341
Test: atest PowerStatsTestsRavenwood; atest PowerStatsTests
Flag: EXEMPT_bugfix
Change-Id: Ie1de99975b2c5458892c4aec8a53d9a44ad8dbfc
parent a406aec7
Loading
Loading
Loading
Loading
+24 −22
Original line number Diff line number Diff line
@@ -488,8 +488,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new CpuPowerStatsProcessor(mPowerProfile, mCpuScalingPolicies));
                .setProcessorSupplier(
                        () -> new CpuPowerStatsProcessor(mPowerProfile, mCpuScalingPolicies));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SCREEN)
                .trackDeviceStates(
@@ -498,12 +498,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                .trackUidStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN)
                .setProcessor(
                        new ScreenPowerStatsProcessor(mPowerProfile));
                .setProcessorSupplier(
                        () -> new ScreenPowerStatsProcessor(mPowerProfile));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
                        BatteryConsumer.POWER_COMPONENT_SCREEN)
                .setProcessor(new AmbientDisplayPowerStatsProcessor());
                .setProcessorSupplier(AmbientDisplayPowerStatsProcessor::new);

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)
                .trackDeviceStates(
@@ -513,12 +513,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new MobileRadioPowerStatsProcessor(mPowerProfile));
                .setProcessorSupplier(
                        () -> new MobileRadioPowerStatsProcessor(mPowerProfile));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE,
                        BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)
                .setProcessor(new PhoneCallPowerStatsProcessor());
                .setProcessorSupplier(PhoneCallPowerStatsProcessor::new);

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI)
                .trackDeviceStates(
@@ -528,8 +528,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new WifiPowerStatsProcessor(mPowerProfile));
                .setProcessorSupplier(
                        () -> new WifiPowerStatsProcessor(mPowerProfile));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BLUETOOTH)
                .trackDeviceStates(
@@ -539,8 +539,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new BluetoothPowerStatsProcessor(mPowerProfile));
                .setProcessorSupplier(
                        () -> new BluetoothPowerStatsProcessor(mPowerProfile));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AUDIO)
                .trackDeviceStates(
@@ -550,8 +550,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new AudioPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));
                .setProcessorSupplier(
                        () -> new AudioPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_VIDEO)
                .trackDeviceStates(
@@ -561,7 +561,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(new VideoPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));
                .setProcessorSupplier(
                        () -> new VideoPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)
                .trackDeviceStates(
@@ -571,8 +572,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new FlashlightPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));
                .setProcessorSupplier(
                        () -> new FlashlightPowerStatsProcessor(mPowerProfile,
                                mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CAMERA)
                .trackDeviceStates(
@@ -582,8 +584,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new CameraPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));
                .setProcessorSupplier(
                        () -> new CameraPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_GNSS)
                .trackDeviceStates(
@@ -593,8 +595,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new GnssPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));
                .setProcessorSupplier(
                        () -> new GnssPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SENSORS)
                .trackDeviceStates(
@@ -604,7 +606,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(new SensorPowerStatsProcessor(
                .setProcessorSupplier(() -> new SensorPowerStatsProcessor(
                        () -> mContext.getSystemService(SensorManager.class)));

        config.trackCustomPowerComponents(CustomEnergyConsumerPowerStatsProcessor::new)
+5 −7
Original line number Diff line number Diff line
@@ -174,8 +174,7 @@ class AggregatedPowerStats {

    void start(long timestampMs) {
        for (int i = 0; i < mPowerComponentStats.size(); i++) {
            PowerComponentAggregatedPowerStats component = mPowerComponentStats.valueAt(i);
            component.getConfig().getProcessor().start(component, timestampMs);
            mPowerComponentStats.valueAt(i).start(timestampMs);
        }
    }

@@ -211,24 +210,23 @@ class AggregatedPowerStats {
            stats = new PowerComponentAggregatedPowerStats(this, powerComponent);
            stats.setPowerStatsDescriptor(powerStats.descriptor);
            stats.copyStatesFrom(mGenericPowerComponent);
            stats.start(time);
            mPowerComponentStats.put(powerComponentId, stats);
        }

        PowerStatsProcessor processor = stats.getConfig().getProcessor();
        processor.addPowerStats(stats, powerStats, time);
        stats.addPowerStats(powerStats, time);
    }

    public void noteStateChange(BatteryStats.HistoryItem item) {
        for (int i = 0; i < mPowerComponentStats.size(); i++) {
            PowerComponentAggregatedPowerStats stats = mPowerComponentStats.valueAt(i);
            stats.getConfig().getProcessor().noteStateChange(stats, item);
            mPowerComponentStats.valueAt(i).noteStateChange(item);
        }
    }

    void finish(long timestampMs) {
        for (int i = 0; i < mPowerComponentStats.size(); i++) {
            PowerComponentAggregatedPowerStats component = mPowerComponentStats.valueAt(i);
            component.getConfig().getProcessor().finish(component, timestampMs);
            component.finish(timestampMs);
        }
    }

+13 −9
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ public class AggregatedPowerStatsConfig {
        private final int mPowerComponentId;
        private @TrackedState int[] mTrackedDeviceStates;
        private @TrackedState int[] mTrackedUidStates;
        private PowerStatsProcessor mProcessor = NO_OP_PROCESSOR;
        private Supplier<PowerStatsProcessor> mProcessorSupplier;

        PowerComponent(int powerComponentId) {
            this.mPowerComponentId = powerComponentId;
@@ -103,12 +103,13 @@ public class AggregatedPowerStatsConfig {
        }

        /**
         * Takes an object that should be invoked for every aggregated stats span
         * before giving the aggregates stats to consumers. The processor can complete the
         * aggregation process, for example by computing estimated power usage.
         * A PowerStatsProcessor takes an object that should be invoked for every aggregated
         * stats span before giving the aggregates stats to consumers. The processor can complete
         * the aggregation process, for example by computing estimated power usage.
         */
        public PowerComponent setProcessor(@NonNull PowerStatsProcessor processor) {
            mProcessor = processor;
        public PowerComponent setProcessorSupplier(
                @NonNull Supplier<PowerStatsProcessor> processorSupplier) {
            mProcessorSupplier = processorSupplier;
            return this;
        }

@@ -142,8 +143,11 @@ public class AggregatedPowerStatsConfig {
        }

        @NonNull
        PowerStatsProcessor getProcessor() {
            return mProcessor;
        PowerStatsProcessor createProcessor() {
            if (mProcessorSupplier == null) {
                return NO_OP_PROCESSOR;
            }
            return mProcessorSupplier.get();
        }

        private boolean isTracked(int[] trackedStates, int state) {
@@ -236,7 +240,7 @@ public class AggregatedPowerStatsConfig {
        powerComponent.trackUidStates(mCustomPowerComponent.mTrackedUidStates);

        if (mCustomPowerStatsProcessorFactory != null) {
            powerComponent.setProcessor(mCustomPowerStatsProcessorFactory.get());
            powerComponent.setProcessorSupplier(mCustomPowerStatsProcessorFactory);
        }

        return powerComponent;
+1 −1
Original line number Diff line number Diff line
@@ -163,7 +163,7 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {

    private void flushPowerStats(PowerComponentAggregatedPowerStats stats, long timestamp) {
        mPowerStats.durationMs = timestamp - mLastUpdateTimestamp;
        stats.addPowerStats(mPowerStats, timestamp);
        stats.addProcessedPowerStats(mPowerStats, timestamp);

        Arrays.fill(mPowerStats.stats, 0);
        mPowerStats.uidStats.clear();
+25 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.android.server.power.stats.MultiStateStats.STATE_DOES_NOT_EXIS

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.BatteryStats;
import android.os.UserHandle;
import android.util.IndentingPrintWriter;
import android.util.Slog;
@@ -64,6 +65,7 @@ class PowerComponentAggregatedPowerStats {
    private final MultiStateStats.States[] mUidStateConfig;
    private final int[] mDeviceStates;

    private PowerStatsProcessor mProcessor;
    private MultiStateStats.Factory mStatsFactory;
    private MultiStateStats.Factory mStateStatsFactory;
    private MultiStateStats.Factory mUidStatsFactory;
@@ -110,6 +112,21 @@ class PowerComponentAggregatedPowerStats {
        mPowerStatsDescriptor = powerStatsDescriptor;
    }

    void start(long timestampMs) {
        if (mProcessor == null) {
            mProcessor = mConfig.createProcessor();
        }
        mProcessor.start(this, timestampMs);
    }

    void finish(long timestampMs) {
        mProcessor.finish(this, timestampMs);
    }

    void noteStateChange(BatteryStats.HistoryItem item) {
        mProcessor.noteStateChange(this, item);
    }

    void setState(@AggregatedPowerStatsConfig.TrackedState int stateId, int state,
            long timestampMs) {
        if (mDeviceStats == null) {
@@ -183,6 +200,14 @@ class PowerComponentAggregatedPowerStats {
    }

    void addPowerStats(PowerStats powerStats, long timestampMs) {
        // Should call powerStats.addProcessedPowerStats
        mProcessor.addPowerStats(this, powerStats, timestampMs);
    }

    /**
     * Should be called ONLY by PowerStatsProcessor.processPowerStats.
     */
    void addProcessedPowerStats(PowerStats powerStats, long timestampMs) {
        mPowerStatsDescriptor = powerStats.descriptor;

        if (mDeviceStats == null) {
Loading