Merge "Ref count isolated uid use for long partial wakelocks" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
7dd534b98a
@@ -5432,7 +5432,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
public void noteLongPartialWakelockStart(String name, String historyName, int uid,
|
public void noteLongPartialWakelockStart(String name, String historyName, int uid,
|
||||||
long elapsedRealtimeMs, long uptimeMs) {
|
long elapsedRealtimeMs, long uptimeMs) {
|
||||||
uid = mapUid(uid);
|
|
||||||
noteLongPartialWakeLockStartInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs);
|
noteLongPartialWakeLockStartInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5467,15 +5466,21 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
private void noteLongPartialWakeLockStartInternal(String name, String historyName, int uid,
|
private void noteLongPartialWakeLockStartInternal(String name, String historyName, int uid,
|
||||||
long elapsedRealtimeMs, long uptimeMs) {
|
long elapsedRealtimeMs, long uptimeMs) {
|
||||||
|
final int mappedUid = mapUid(uid);
|
||||||
if (historyName == null) {
|
if (historyName == null) {
|
||||||
historyName = name;
|
historyName = name;
|
||||||
}
|
}
|
||||||
if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName, uid,
|
if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_START, historyName,
|
||||||
0)) {
|
mappedUid, 0)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_START,
|
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")
|
@GuardedBy("this")
|
||||||
@@ -5487,7 +5492,6 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
public void noteLongPartialWakelockFinish(String name, String historyName, int uid,
|
public void noteLongPartialWakelockFinish(String name, String historyName, int uid,
|
||||||
long elapsedRealtimeMs, long uptimeMs) {
|
long elapsedRealtimeMs, long uptimeMs) {
|
||||||
uid = mapUid(uid);
|
|
||||||
noteLongPartialWakeLockFinishInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs);
|
noteLongPartialWakeLockFinishInternal(name, historyName, uid, elapsedRealtimeMs, uptimeMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5522,15 +5526,20 @@ public class BatteryStatsImpl extends BatteryStats {
|
|||||||
@GuardedBy("this")
|
@GuardedBy("this")
|
||||||
private void noteLongPartialWakeLockFinishInternal(String name, String historyName, int uid,
|
private void noteLongPartialWakeLockFinishInternal(String name, String historyName, int uid,
|
||||||
long elapsedRealtimeMs, long uptimeMs) {
|
long elapsedRealtimeMs, long uptimeMs) {
|
||||||
|
final int mappedUid = mapUid(uid);
|
||||||
if (historyName == null) {
|
if (historyName == null) {
|
||||||
historyName = name;
|
historyName = name;
|
||||||
}
|
}
|
||||||
if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName, uid,
|
if (!mActiveEvents.updateState(HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH, historyName,
|
||||||
0)) {
|
mappedUid, 0)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.EVENT_LONG_WAKE_LOCK_FINISH,
|
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")
|
@GuardedBy("this")
|
||||||
|
|||||||
@@ -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_CPU;
|
||||||
import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_DISPLAY;
|
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 static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
@@ -228,6 +230,116 @@ public class BatteryStatsNoteTest extends TestCase {
|
|||||||
assertEquals(120_000, bgTime);
|
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.
|
* Test BatteryStatsImpl.noteUidProcessStateLocked.
|
||||||
|
|||||||
Reference in New Issue
Block a user