Merge "Fix potential crash when per-procstate cpu times tracking is turned on."

am: daddc5bb50

Change-Id: I8d4541aaf08b462b212b6530f2366d1dd5eaa147
This commit is contained in:
Sudheer Shanka
2019-02-21 17:43:24 -08:00
committed by android-build-merger
2 changed files with 13 additions and 18 deletions

View File

@@ -229,6 +229,15 @@ public class BatteryStatsImpl extends BatteryStats {
@GuardedBy("this")
public boolean mPerProcStateCpuTimesAvailable = true;
/**
* When per process state cpu times tracking is off, cpu times in KernelSingleUidTimeReader are
* not updated. So, when the setting is turned on later, we would end up with huge cpu time
* deltas. This flag tracks the case where tracking is turned on from off so that we won't
* end up attributing the huge deltas to wrong buckets.
*/
@GuardedBy("this")
private boolean mIsPerProcessStateCpuDataStale;
/**
* Uids for which per-procstate cpu times need to be updated.
*
@@ -402,7 +411,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
// If the KernelSingleUidTimeReader has stale cpu times, then we shouldn't try to
// compute deltas since it might result in mis-attributing cpu times to wrong states.
if (mKernelSingleUidTimeReader.hasStaleData()) {
if (mIsPerProcessStateCpuDataStale) {
mPendingUids.clear();
return;
}
@@ -485,9 +494,9 @@ public class BatteryStatsImpl extends BatteryStats {
mKernelUidCpuFreqTimeReader.getAllUidCpuFreqTimeMs();
// If the KernelSingleUidTimeReader has stale cpu times, then we shouldn't try to
// compute deltas since it might result in mis-attributing cpu times to wrong states.
if (mKernelSingleUidTimeReader.hasStaleData()) {
if (mIsPerProcessStateCpuDataStale) {
mKernelSingleUidTimeReader.setAllUidsCpuTimesMs(allUidCpuFreqTimesMs);
mKernelSingleUidTimeReader.markDataAsStale(false);
mIsPerProcessStateCpuDataStale = false;
mPendingUids.clear();
return;
}
@@ -13430,7 +13439,7 @@ public class BatteryStatsImpl extends BatteryStats {
private void updateTrackCpuTimesByProcStateLocked(boolean wasEnabled, boolean isEnabled) {
TRACK_CPU_TIMES_BY_PROC_STATE = isEnabled;
if (isEnabled && !wasEnabled) {
mKernelSingleUidTimeReader.markDataAsStale(true);
mIsPerProcessStateCpuDataStale = true;
mExternalSync.scheduleCpuSyncDueToSettingChange();
mNumSingleUidCpuTimeReads = 0;

View File

@@ -53,8 +53,6 @@ public class KernelSingleUidTimeReader {
private int mReadErrorCounter;
@GuardedBy("this")
private boolean mSingleUidCpuTimesAvailable = true;
@GuardedBy("this")
private boolean mHasStaleData;
// We use the freq count obtained from /proc/uid_time_in_state to decide how many longs
// to read from each /proc/uid/<uid>/time_in_state. On the first read, verify if this is
// correct and if not, set {@link #mSingleUidCpuTimesAvailable} to false. This flag will
@@ -196,18 +194,6 @@ public class KernelSingleUidTimeReader {
return deltaTimesMs;
}
public void markDataAsStale(boolean hasStaleData) {
synchronized (this) {
mHasStaleData = hasStaleData;
}
}
public boolean hasStaleData() {
synchronized (this) {
return mHasStaleData;
}
}
public void setAllUidsCpuTimesMs(SparseArray<long[]> allUidsCpuTimesMs) {
synchronized (this) {
mLastUidCpuTimeMs.clear();