diff options
| author | 2011-10-19 11:10:18 -0700 | |
|---|---|---|
| committer | 2011-10-19 11:10:18 -0700 | |
| commit | 3585a3dfc6824581e8b4b46bfa1207bb18fad0cf (patch) | |
| tree | 194c8e9b78f6b3343ef3095b3d8b293d4711adb8 | |
| parent | 08bad20ee7ecbe0da0f1caa9455a54f1948e35b9 (diff) | |
| parent | 47f8367ab79247501d5d204632a7797fa8a888e5 (diff) | |
am 47f8367a: Merge "Work on issue #5465917: Wakelock *overflow* held for very long times" into ics-mr0
* commit '47f8367ab79247501d5d204632a7797fa8a888e5':
Work on issue #5465917: Wakelock *overflow* held for very long times
| -rw-r--r-- | core/java/android/content/SyncManager.java | 2 | ||||
| -rw-r--r-- | core/java/android/os/BatteryStats.java | 54 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/BatteryStatsImpl.java | 18 |
3 files changed, 63 insertions, 11 deletions
diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 42253930ae98..7d683a53f51d 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -990,8 +990,8 @@ public class SyncManager implements OnAccountsUpdateListener { mBound = false; mContext.unbindService(this); } - mSyncWakeLock.setWorkSource(null); mSyncWakeLock.release(); + mSyncWakeLock.setWorkSource(null); } @Override diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index e3441978df04..438c5366b2b5 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -1095,6 +1095,16 @@ public abstract class BatteryStats implements Parcelable { } } + private static long computeWakeLock(Timer timer, long batteryRealtime, int which) { + if (timer != null) { + // Convert from microseconds to milliseconds with rounding + long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which); + long totalTimeMillis = (totalTimeMicros + 500) / 1000; + return totalTimeMillis; + } + return 0; + } + /** * * @param sb a StringBuilder object. @@ -1109,9 +1119,7 @@ public abstract class BatteryStats implements Parcelable { long batteryRealtime, String name, int which, String linePrefix) { if (timer != null) { - // Convert from microseconds to milliseconds with rounding - long totalTimeMicros = timer.getTotalTimeLocked(batteryRealtime, which); - long totalTimeMillis = (totalTimeMicros + 500) / 1000; + long totalTimeMillis = computeWakeLock(timer, batteryRealtime, which); int count = timer.getCountLocked(which); if (totalTimeMillis != 0) { @@ -1735,6 +1743,8 @@ public abstract class BatteryStats implements Parcelable { Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); if (wakelocks.size() > 0) { + long totalFull = 0, totalPartial = 0, totalWindow = 0; + int count = 0; for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent : wakelocks.entrySet()) { Uid.Wakelock wl = ent.getValue(); @@ -1754,6 +1764,44 @@ public abstract class BatteryStats implements Parcelable { // Only print out wake locks that were held pw.println(sb.toString()); uidActivity = true; + count++; + } + totalFull += computeWakeLock(wl.getWakeTime(WAKE_TYPE_FULL), + batteryRealtime, which); + totalPartial += computeWakeLock(wl.getWakeTime(WAKE_TYPE_PARTIAL), + batteryRealtime, which); + totalWindow += computeWakeLock(wl.getWakeTime(WAKE_TYPE_WINDOW), + batteryRealtime, which); + } + if (count > 1) { + if (totalFull != 0 || totalPartial != 0 || totalWindow != 0) { + sb.setLength(0); + sb.append(prefix); + sb.append(" TOTAL wake: "); + boolean needComma = false; + if (totalFull != 0) { + needComma = true; + formatTimeMs(sb, totalFull); + sb.append("full"); + } + if (totalPartial != 0) { + if (needComma) { + sb.append(", "); + } + needComma = true; + formatTimeMs(sb, totalPartial); + sb.append("partial"); + } + if (totalWindow != 0) { + if (needComma) { + sb.append(", "); + } + needComma = true; + formatTimeMs(sb, totalWindow); + sb.append("window"); + } + sb.append(" realtime"); + pw.println(sb.toString()); } } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index e2a25665adaa..3e96c815e9b6 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -98,6 +98,10 @@ public final class BatteryStatsImpl extends BatteryStats { // in to one common name. private static final int MAX_WAKELOCKS_PER_UID = 30; + // The system process gets more. It is special. Oh so special. + // With, you know, special needs. Like this. + private static final int MAX_WAKELOCKS_PER_UID_IN_SYSTEM = 50; + private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; private static int sNumSpeedSteps; @@ -2895,12 +2899,10 @@ public final class BatteryStatsImpl extends BatteryStats { String wakelockName = in.readString(); Uid.Wakelock wakelock = new Wakelock(); wakelock.readFromParcelLocked(unpluggables, in); - if (mWakelockStats.size() < MAX_WAKELOCKS_PER_UID) { - // We will just drop some random set of wakelocks if - // the previous run of the system was an older version - // that didn't impose a limit. - mWakelockStats.put(wakelockName, wakelock); - } + // We will just drop some random set of wakelocks if + // the previous run of the system was an older version + // that didn't impose a limit. + mWakelockStats.put(wakelockName, wakelock); } int numSensors = in.readInt(); @@ -3904,7 +3906,9 @@ public final class BatteryStatsImpl extends BatteryStats { public StopwatchTimer getWakeTimerLocked(String name, int type) { Wakelock wl = mWakelockStats.get(name); if (wl == null) { - if (mWakelockStats.size() > MAX_WAKELOCKS_PER_UID) { + final int N = mWakelockStats.size(); + if (N > MAX_WAKELOCKS_PER_UID && (mUid != Process.SYSTEM_UID + || N > MAX_WAKELOCKS_PER_UID_IN_SYSTEM)) { name = BATCHED_WAKELOCK_NAME; wl = mWakelockStats.get(name); } |