Merge "Fix concurrency issue with BatteryUsageStats"

This commit is contained in:
Dmitri Plotnikov
2022-01-21 22:44:28 +00:00
committed by Gerrit Code Review

View File

@@ -21,6 +21,7 @@ import android.hardware.SensorManager;
import android.os.BatteryStats; import android.os.BatteryStats;
import android.os.BatteryUsageStats; import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery; import android.os.BatteryUsageStatsQuery;
import android.os.Parcel;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UidBatteryConsumer; import android.os.UidBatteryConsumer;
import android.util.Log; import android.util.Log;
@@ -186,16 +187,23 @@ public class BatteryUsageStatsProvider {
} }
BatteryStatsImpl batteryStatsImpl = (BatteryStatsImpl) mStats; BatteryStatsImpl batteryStatsImpl = (BatteryStatsImpl) mStats;
// Make a copy of battery history to avoid concurrent modification.
Parcel historyBuffer = Parcel.obtain();
historyBuffer.appendFrom(batteryStatsImpl.mHistoryBuffer, 0,
batteryStatsImpl.mHistoryBuffer.dataSize());
ArrayList<BatteryStats.HistoryTag> tags = new ArrayList<>( ArrayList<BatteryStats.HistoryTag> tags = new ArrayList<>(
batteryStatsImpl.mHistoryTagPool.size()); batteryStatsImpl.mHistoryTagPool.size());
for (Map.Entry<BatteryStats.HistoryTag, Integer> entry : for (Map.Entry<BatteryStats.HistoryTag, Integer> entry :
batteryStatsImpl.mHistoryTagPool.entrySet()) { batteryStatsImpl.mHistoryTagPool.entrySet()) {
final BatteryStats.HistoryTag tag = entry.getKey(); final BatteryStats.HistoryTag tag = new BatteryStats.HistoryTag();
tag.setTo(entry.getKey());
tag.poolIdx = entry.getValue(); tag.poolIdx = entry.getValue();
tags.add(tag); tags.add(tag);
} }
batteryUsageStatsBuilder.setBatteryHistory(batteryStatsImpl.mHistoryBuffer, tags); batteryUsageStatsBuilder.setBatteryHistory(historyBuffer, tags);
} }
return batteryUsageStatsBuilder.build(); return batteryUsageStatsBuilder.build();