Merge "Fix concurrency issue with BatteryUsageStats"

This commit is contained in:
Dmitri Plotnikov
2022-01-04 19:53:03 +00:00
committed by Android (Google) Code Review

View File

@@ -21,11 +21,13 @@ import android.hardware.SensorManager;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Parcel;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.util.Log;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
@@ -133,9 +135,12 @@ public class BatteryUsageStatsProvider {
*/
@VisibleForTesting
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
return getBatteryUsageStats(query, currentTimeMillis());
synchronized (mStats) {
return getBatteryUsageStats(query, currentTimeMillis());
}
}
@GuardedBy("mStats")
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query,
long currentTimeMs) {
if (query.getToTimestamp() == 0) {
@@ -145,6 +150,7 @@ public class BatteryUsageStatsProvider {
}
}
@GuardedBy("mStats")
private BatteryUsageStats getCurrentBatteryUsageStats(BatteryUsageStatsQuery query,
long currentTimeMs) {
final long realtimeUs = elapsedRealtime() * 1000;
@@ -189,7 +195,12 @@ public class BatteryUsageStatsProvider {
}
BatteryStatsImpl batteryStatsImpl = (BatteryStatsImpl) mStats;
batteryUsageStatsBuilder.setBatteryHistory(batteryStatsImpl.mHistoryBuffer);
// Make a copy of battery history to avoid concurrent modification.
Parcel historyBuffer = Parcel.obtain();
historyBuffer.appendFrom(batteryStatsImpl.mHistoryBuffer, 0,
batteryStatsImpl.mHistoryBuffer.dataSize());
batteryUsageStatsBuilder.setBatteryHistory(historyBuffer);
}
return batteryUsageStatsBuilder.build();