summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dianne Hackborn <hackbod@google.com> 2016-07-30 00:03:37 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-07-30 00:03:39 +0000
commit29cc1b693937ece2a110057713d07b3194a2f8a5 (patch)
treea131b06bc87c16a5b0a9fb7f144e439dac750702
parentce21ca0fd2b8d353b066908f3573b03ccd07dd39 (diff)
parent657153bd28b36e0eaa223b489f1a80fc85e29be8 (diff)
Merge "Work on issue #30407061: OverflowArrayMap.stopObject unable to find object" into nyc-mr1-dev
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java50
1 files changed, 43 insertions, 7 deletions
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index b174e3325168..17635aefe6ac 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -1791,11 +1791,17 @@ public class BatteryStatsImpl extends BatteryStats {
public abstract class OverflowArrayMap<T> {
private static final String OVERFLOW_NAME = "*overflow*";
+ final int mUid;
final ArrayMap<String, T> mMap = new ArrayMap<>();
T mCurOverflow;
ArrayMap<String, MutableInt> mActiveOverflow;
+ long mLastOverflowTime;
+ long mLastOverflowFinishTime;
+ long mLastClearTime;
+ long mLastCleanupTime;
- public OverflowArrayMap() {
+ public OverflowArrayMap(int uid) {
+ mUid = uid;
}
public ArrayMap<String, T> getMap() {
@@ -1803,6 +1809,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
public void clear() {
+ mLastClearTime = SystemClock.elapsedRealtime();
mMap.clear();
mCurOverflow = null;
mActiveOverflow = null;
@@ -1819,6 +1826,7 @@ public class BatteryStatsImpl extends BatteryStats {
}
public void cleanup() {
+ mLastCleanupTime = SystemClock.elapsedRealtime();
if (mActiveOverflow != null) {
if (mActiveOverflow.size() == 0) {
mActiveOverflow = null;
@@ -1885,6 +1893,7 @@ public class BatteryStatsImpl extends BatteryStats {
mActiveOverflow = new ArrayMap<>();
}
mActiveOverflow.put(name, new MutableInt(1));
+ mLastOverflowTime = SystemClock.elapsedRealtime();
return obj;
}
@@ -1914,6 +1923,7 @@ public class BatteryStatsImpl extends BatteryStats {
over.value--;
if (over.value <= 0) {
mActiveOverflow.remove(name);
+ mLastOverflowFinishTime = SystemClock.elapsedRealtime();
}
return obj;
}
@@ -1922,9 +1932,35 @@ public class BatteryStatsImpl extends BatteryStats {
// Huh, they are stopping an active operation but we can't find one!
// That's not good.
- Slog.wtf(TAG, "Unable to find object for " + name + " mapsize="
- + mMap.size() + " activeoverflow=" + mActiveOverflow
- + " curoverflow=" + mCurOverflow);
+ StringBuilder sb = new StringBuilder();
+ sb.append("Unable to find object for ");
+ sb.append(name);
+ sb.append(" in uid ");
+ sb.append(mUid);
+ sb.append(" mapsize=");
+ sb.append(mMap.size());
+ sb.append(" activeoverflow=");
+ sb.append(mActiveOverflow);
+ sb.append(" curoverflow=");
+ sb.append(mCurOverflow);
+ long now = SystemClock.elapsedRealtime();
+ if (mLastOverflowTime != 0) {
+ sb.append(" lastOverflowTime=");
+ TimeUtils.formatDuration(mLastOverflowTime-now, sb);
+ }
+ if (mLastOverflowFinishTime != 0) {
+ sb.append(" lastOverflowFinishTime=");
+ TimeUtils.formatDuration(mLastOverflowFinishTime-now, sb);
+ }
+ if (mLastClearTime != 0) {
+ sb.append(" lastClearTime=");
+ TimeUtils.formatDuration(mLastClearTime-now, sb);
+ }
+ if (mLastCleanupTime != 0) {
+ sb.append(" lastCleanupTime=");
+ TimeUtils.formatDuration(mLastCleanupTime-now, sb);
+ }
+ Slog.wtf(TAG, sb.toString());
return null;
}
@@ -5084,18 +5120,18 @@ public class BatteryStatsImpl extends BatteryStats {
mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
mCpuPower = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
- mWakelockStats = mBsi.new OverflowArrayMap<Wakelock>() {
+ mWakelockStats = mBsi.new OverflowArrayMap<Wakelock>(uid) {
@Override public Wakelock instantiateObject() {
return new Wakelock(mBsi, Uid.this);
}
};
- mSyncStats = mBsi.new OverflowArrayMap<StopwatchTimer>() {
+ mSyncStats = mBsi.new OverflowArrayMap<StopwatchTimer>(uid) {
@Override public StopwatchTimer instantiateObject() {
return new StopwatchTimer(mBsi.mClocks, Uid.this, SYNC, null,
mBsi.mOnBatteryTimeBase);
}
};
- mJobStats = mBsi.new OverflowArrayMap<StopwatchTimer>() {
+ mJobStats = mBsi.new OverflowArrayMap<StopwatchTimer>(uid) {
@Override public StopwatchTimer instantiateObject() {
return new StopwatchTimer(mBsi.mClocks, Uid.this, JOB, null,
mBsi.mOnBatteryTimeBase);