diff options
| author | 2019-02-22 01:24:03 +0000 | |
|---|---|---|
| committer | 2019-02-22 01:24:03 +0000 | |
| commit | daddc5bb50ad7ae50dffdcd31fd20c5c44f45fff (patch) | |
| tree | bbc45e6ae28c69fc536d8c734016436332d5d5ea | |
| parent | 862821ede5b32998d4105ba0cc69c1bd2b1af342 (diff) | |
| parent | 6ebb1d15f38905afbd3c22563a7ba73762a6053f (diff) | |
Merge "Fix potential crash when per-procstate cpu times tracking is turned on."
| -rw-r--r-- | core/java/com/android/internal/os/BatteryStatsImpl.java | 17 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/KernelSingleUidTimeReader.java | 14 |
2 files changed, 13 insertions, 18 deletions
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8b06c47c60d1..4ad454514532 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -230,6 +230,15 @@ public class BatteryStatsImpl extends BatteryStats { 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. * * Contains uid -> procState mappings. @@ -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; diff --git a/core/java/com/android/internal/os/KernelSingleUidTimeReader.java b/core/java/com/android/internal/os/KernelSingleUidTimeReader.java index 42839171dc53..ad628524f443 100644 --- a/core/java/com/android/internal/os/KernelSingleUidTimeReader.java +++ b/core/java/com/android/internal/os/KernelSingleUidTimeReader.java @@ -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(); |