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

Commit 9b102739 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Fix concurrency issues in BatteryUsageStatsProvider

Bug: 318087913
Test: atest PowerStatsTests
Change-Id: I03adc41a0e388812aff609d8989148ab316ed652
parent 0cf54548
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -20144,8 +20144,7 @@ public class ActivityManagerService extends IActivityManager.Stub
         * Returns the {@link BatteryStatsService} instance
         */
        public BatteryStatsService getBatteryStatsService() {
            return new BatteryStatsService(mContext, SystemServiceManager.ensureSystemDir(),
                BackgroundThread.get().getHandler());
            return new BatteryStatsService(mContext, SystemServiceManager.ensureSystemDir());
        }
        /**
+3 −4
Original line number Diff line number Diff line
@@ -381,8 +381,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        }
    };

    BatteryStatsService(Context context, File systemDir, Handler handler) {
        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
    BatteryStatsService(Context context, File systemDir) {
        mContext = context;
        mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
            private UserManagerInternal umi;
@@ -416,7 +415,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        .build();
        mPowerStatsUidResolver = new PowerStatsUidResolver();
        mStats = new BatteryStatsImpl(mBatteryStatsConfig, Clock.SYSTEM_CLOCK, mMonotonicClock,
                systemDir, handler, this, this, mUserManagerUserInfoProvider, mPowerProfile,
                systemDir, mHandler, this, this, mUserManagerUserInfoProvider, mPowerProfile,
                mCpuScalingPolicies, mPowerStatsUidResolver);
        mWorker = new BatteryExternalStatsWorker(context, mStats);
        mStats.setExternalStatsSyncLocked(mWorker);
@@ -477,7 +476,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
     */
    public static BatteryStatsService create(Context context, File systemDir, Handler handler,
            BatteryStatsImpl.BatteryCallback callback) {
        BatteryStatsService service = new BatteryStatsService(context, systemDir, handler);
        BatteryStatsService service = new BatteryStatsService(context, systemDir);
        service.mStats.setCallback(callback);
        synchronized (service.mStats) {
            service.mStats.readLocked();
+26 −21
Original line number Diff line number Diff line
@@ -170,7 +170,11 @@ public class BatteryUsageStatsProvider {
        final double minConsumedPowerThreshold = query.getMinConsumedPowerThreshold();

        final BatteryUsageStats.Builder batteryUsageStatsBuilder;
        long monotonicStartTime, monotonicEndTime;
        synchronized (stats) {
            monotonicStartTime = stats.getMonotonicStartTime();
            monotonicEndTime = stats.getMonotonicEndTime();

            batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
                    stats.getCustomEnergyConsumerNames(), includePowerModels,
                    includeProcessStateData, minConsumedPowerThreshold);
@@ -195,7 +199,6 @@ public class BatteryUsageStatsProvider {
                                UidBatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
                                getProcessForegroundServiceTimeMs(uid, realtimeUs));
            }
        }

            final int[] powerComponents = query.getPowerComponents();
            final List<PowerCalculator> powerCalculators = getPowerCalculators();
@@ -213,18 +216,20 @@ public class BatteryUsageStatsProvider {
                        continue;
                    }
                }
            powerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs, query);
        }

        if (mPowerStatsExporterEnabled) {
            mPowerStatsExporter.exportAggregatedPowerStats(batteryUsageStatsBuilder,
                    stats.getMonotonicStartTime(), stats.getMonotonicEndTime());
                powerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs,
                        query);
            }

            if ((query.getFlags()
                    & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY) != 0) {
                batteryUsageStatsBuilder.setBatteryHistory(stats.copyHistory());
            }
        }

        if (mPowerStatsExporterEnabled) {
            mPowerStatsExporter.exportAggregatedPowerStats(batteryUsageStatsBuilder,
                    monotonicStartTime, monotonicEndTime);
        }

        BatteryUsageStats batteryUsageStats = batteryUsageStatsBuilder.build();
        if (includeProcessStateData) {
+1 −1
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ public final class BatteryStatsServiceTest {
        mBgThread.start();
        File systemDir = context.getCacheDir();
        Handler handler = new Handler(mBgThread.getLooper());
        mBatteryStatsService = new BatteryStatsService(context, systemDir, handler);
        mBatteryStatsService = new BatteryStatsService(context, systemDir);
    }

    @After