Loading core/java/com/android/internal/os/BatteryStatsImpl.java +17 −8 Original line number Diff line number Diff line Loading @@ -5432,7 +5432,6 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteLongPartialWakelockStart(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { uid = mapUid(uid); noteLongPartialWakeLockStartInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs); } Loading Loading @@ -5467,15 +5466,21 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") private void noteLongPartialWakeLockStartInternal(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { final int mappedUid = mapUid(uid); if (historyName == null) { historyName = name; } if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, uid, 0)) { if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, mappedUid, 0)) { return; } addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, uid); historyName, mappedUid); if (mappedUid != uid) { // Prevent the isolated uid mapping from being removed while the wakelock is // being held. incrementIsolatedUidRefCount(uid); } } @GuardedBy("this") Loading @@ -5487,7 +5492,6 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteLongPartialWakelockFinish(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { uid = mapUid(uid); noteLongPartialWakeLockFinishInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs); } Loading Loading @@ -5522,15 +5526,20 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") private void noteLongPartialWakeLockFinishInternal(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { final int mappedUid = mapUid(uid); if (historyName == null) { historyName = name; } if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, uid, 0)) { if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, mappedUid, 0)) { return; } addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, uid); historyName, mappedUid); if (mappedUid != uid) { // Decrement the ref count for the isolated uid and delete the mapping if uneeded. maybeRemoveIsolatedUidLocked(uid, elapsedRealtimeMs, uptimeMs); } } @GuardedBy("this") Loading core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +112 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import static android.os.BatteryStats.WAKE_TYPE_PARTIAL; import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU; import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_DISPLAY; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import android.app.ActivityManager; Loading Loading @@ -228,6 +230,116 @@ public class BatteryStatsNoteTest extends TestCase { assertEquals(120_000, bgTime); } /** * Test BatteryStatsImpl.Uid.noteLongPartialWakelockStart for an isolated uid. */ @SmallTest public void testNoteLongPartialWakelockStart_isolatedUid() throws Exception { final MockClock clocks = new MockClock(); // holds realtime and uptime in ms MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); bi.setRecordAllHistoryLocked(true); bi.forceRecordAllHistory(); int pid = 10; String name = "name"; String historyName = "historyName"; WorkSource.WorkChain isolatedWorkChain = new WorkSource.WorkChain(); isolatedWorkChain.addNode(ISOLATED_UID, name); // Map ISOLATED_UID to UID. bi.addIsolatedUidLocked(ISOLATED_UID, UID); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP); bi.noteLongPartialWakelockStart(name, historyName, ISOLATED_UID); clocks.realtime = clocks.uptime = 100; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); clocks.realtime = clocks.uptime = 220; bi.noteLongPartialWakelockFinish(name, historyName, ISOLATED_UID); final BatteryStatsHistoryIterator iterator = bi.createBatteryStatsHistoryIterator(); BatteryStats.HistoryItem item = new BatteryStats.HistoryItem(); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_START) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_START); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); } /** * Test BatteryStatsImpl.Uid.noteLongPartialWakelockStart for an isolated uid. */ @SmallTest public void testNoteLongPartialWakelockStart_isolatedUidRace() throws Exception { final MockClock clocks = new MockClock(); // holds realtime and uptime in ms MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); bi.setRecordAllHistoryLocked(true); bi.forceRecordAllHistory(); int pid = 10; String name = "name"; String historyName = "historyName"; WorkSource.WorkChain isolatedWorkChain = new WorkSource.WorkChain(); isolatedWorkChain.addNode(ISOLATED_UID, name); // Map ISOLATED_UID to UID. bi.addIsolatedUidLocked(ISOLATED_UID, UID); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP); bi.noteLongPartialWakelockStart(name, historyName, ISOLATED_UID); clocks.realtime = clocks.uptime = 100; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); clocks.realtime = clocks.uptime = 150; bi.maybeRemoveIsolatedUidLocked(ISOLATED_UID, clocks.realtime, clocks.uptime); clocks.realtime = clocks.uptime = 220; bi.noteLongPartialWakelockFinish(name, historyName, ISOLATED_UID); final BatteryStatsHistoryIterator iterator = bi.createBatteryStatsHistoryIterator(); BatteryStats.HistoryItem item = new BatteryStats.HistoryItem(); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_START) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_START); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); } /** * Test BatteryStatsImpl.noteUidProcessStateLocked. Loading Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +17 −8 Original line number Diff line number Diff line Loading @@ -5432,7 +5432,6 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteLongPartialWakelockStart(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { uid = mapUid(uid); noteLongPartialWakeLockStartInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs); } Loading Loading @@ -5467,15 +5466,21 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") private void noteLongPartialWakeLockStartInternal(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { final int mappedUid = mapUid(uid); if (historyName == null) { historyName = name; } if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, uid, 0)) { if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, mappedUid, 0)) { return; } addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, uid); historyName, mappedUid); if (mappedUid != uid) { // Prevent the isolated uid mapping from being removed while the wakelock is // being held. incrementIsolatedUidRefCount(uid); } } @GuardedBy("this") Loading @@ -5487,7 +5492,6 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteLongPartialWakelockFinish(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { uid = mapUid(uid); noteLongPartialWakeLockFinishInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs); } Loading Loading @@ -5522,15 +5526,20 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") private void noteLongPartialWakeLockFinishInternal(String name, String historyName, int uid, long elapsedRealtimeMs, long uptimeMs) { final int mappedUid = mapUid(uid); if (historyName == null) { historyName = name; } if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, uid, 0)) { if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, mappedUid, 0)) { return; } addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, uid); historyName, mappedUid); if (mappedUid != uid) { // Decrement the ref count for the isolated uid and delete the mapping if uneeded. maybeRemoveIsolatedUidLocked(uid, elapsedRealtimeMs, uptimeMs); } } @GuardedBy("this") Loading
core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +112 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import static android.os.BatteryStats.WAKE_TYPE_PARTIAL; import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU; import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_DISPLAY; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import android.app.ActivityManager; Loading Loading @@ -228,6 +230,116 @@ public class BatteryStatsNoteTest extends TestCase { assertEquals(120_000, bgTime); } /** * Test BatteryStatsImpl.Uid.noteLongPartialWakelockStart for an isolated uid. */ @SmallTest public void testNoteLongPartialWakelockStart_isolatedUid() throws Exception { final MockClock clocks = new MockClock(); // holds realtime and uptime in ms MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); bi.setRecordAllHistoryLocked(true); bi.forceRecordAllHistory(); int pid = 10; String name = "name"; String historyName = "historyName"; WorkSource.WorkChain isolatedWorkChain = new WorkSource.WorkChain(); isolatedWorkChain.addNode(ISOLATED_UID, name); // Map ISOLATED_UID to UID. bi.addIsolatedUidLocked(ISOLATED_UID, UID); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP); bi.noteLongPartialWakelockStart(name, historyName, ISOLATED_UID); clocks.realtime = clocks.uptime = 100; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); clocks.realtime = clocks.uptime = 220; bi.noteLongPartialWakelockFinish(name, historyName, ISOLATED_UID); final BatteryStatsHistoryIterator iterator = bi.createBatteryStatsHistoryIterator(); BatteryStats.HistoryItem item = new BatteryStats.HistoryItem(); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_START) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_START); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); } /** * Test BatteryStatsImpl.Uid.noteLongPartialWakelockStart for an isolated uid. */ @SmallTest public void testNoteLongPartialWakelockStart_isolatedUidRace() throws Exception { final MockClock clocks = new MockClock(); // holds realtime and uptime in ms MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); bi.setRecordAllHistoryLocked(true); bi.forceRecordAllHistory(); int pid = 10; String name = "name"; String historyName = "historyName"; WorkSource.WorkChain isolatedWorkChain = new WorkSource.WorkChain(); isolatedWorkChain.addNode(ISOLATED_UID, name); // Map ISOLATED_UID to UID. bi.addIsolatedUidLocked(ISOLATED_UID, UID); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP); bi.noteLongPartialWakelockStart(name, historyName, ISOLATED_UID); clocks.realtime = clocks.uptime = 100; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); clocks.realtime = clocks.uptime = 150; bi.maybeRemoveIsolatedUidLocked(ISOLATED_UID, clocks.realtime, clocks.uptime); clocks.realtime = clocks.uptime = 220; bi.noteLongPartialWakelockFinish(name, historyName, ISOLATED_UID); final BatteryStatsHistoryIterator iterator = bi.createBatteryStatsHistoryIterator(); BatteryStats.HistoryItem item = new BatteryStats.HistoryItem(); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_START) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_START); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); while (iterator.next(item)) { if (item.eventCode == HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH) break; } assertThat(item.eventCode).isEqualTo(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH); assertThat(item.eventTag).isNotNull(); assertThat(item.eventTag.string).isEqualTo(historyName); assertThat(item.eventTag.uid).isEqualTo(UID); } /** * Test BatteryStatsImpl.noteUidProcessStateLocked. Loading