From 2098eadfba7aba5d667579222f0fac76d1235ff0 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 2 Apr 2010 13:46:49 -0700 Subject: [PATCH] Potential fix for bug: 2564824 : Device runtime restart in BatteryService Look for corrupted bytes and replace with ? If the problem is in the parsing code, then this will not help. Change-Id: If33643f126a4099d4113e37760c6ef74683fe97e --- core/java/com/android/internal/os/BatteryStatsImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 24275ec4ac31d..833c01bc8ff0c 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -895,9 +895,15 @@ public final class BatteryStatsImpl extends BatteryStats { String[] nameStringArray = mProcWakelocksName; long[] wlData = mProcWakelocksData; + // Stomp out any bad characters since this is from a circular buffer + // A corruption is seen sometimes that results in the vm crashing + // This should prevent crashes and the line will probably fail to parse + for (int j = startIndex; j < endIndex; j++) { + if ((wlBuffer[j] & 0x80) != 0) wlBuffer[j] = (byte) '?'; + } boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex, PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null); - + name = nameStringArray[0]; count = (int) wlData[1]; // convert nanoseconds to microseconds with rounding.