diff options
| author | 2022-03-08 13:25:58 -0800 | |
|---|---|---|
| committer | 2022-03-23 11:55:10 -0700 | |
| commit | 177d5bb18756ddca6e9f9e8caa0338ae07f21c92 (patch) | |
| tree | 85f19739f86f06d41adfb634cab417f5fb6a8323 | |
| parent | 329ed6ef8e3dda96409130e1200faa106f0c4835 (diff) | |
Modify UidRecord.CHANGE_PROCSTATE such that it behaves like a bit mask.
UidRecord.CHANGE_PROCSTATE was allocated the value 0, since it is
assumed that if there is any change to a UidRecord it includes a proc
state change. This is a valid assumption, but is not an unusual design
for a bitmask. This change adds a bit specifically for proc state
changes.
At the time of this change, CHANGE_PROCSTATE should always be set.
However the intention is to pre-empt change
I68d964f474d20f819f54b614a4e314ce00aac8fb, which breaks the assumption
that all UidRecord changes will include proc state. To avoid verbosity,
additional constants have been defined which combine the other change
bits with CHANGE_PROCSTATE for external users to reference.
Change-Id: Iae7e6601938d1b3ee5c4c9b339ae06029eb598e6
Bug: 124224342
Test: -- ActivityManagerServiceTest
-- ActivityManagerProcessStateTest
-- ActivityManagerFgsBgStartTest
-- UidObserverControllerTest
-- CtsAppTestCases
6 files changed, 30 insertions, 12 deletions
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto index 17dc4589d402..2bb891280e71 100644 --- a/core/proto/android/server/activitymanagerservice.proto +++ b/core/proto/android/server/activitymanagerservice.proto @@ -779,6 +779,7 @@ message UidRecordProto { CHANGE_CACHED = 3; CHANGE_UNCACHED = 4; CHANGE_CAPABILITY = 5; + CHANGE_PROCSTATE = 6; } repeated Change last_reported_changes = 8; optional int32 num_procs = 9; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c40f65f54210..45f06c74cac2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -15528,7 +15528,7 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") final void doStopUidLocked(int uid, final UidRecord uidRec) { mServices.stopInBackgroundLocked(uid); - enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE); + enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE | UidRecord.CHANGE_PROCSTATE); } /** diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 9626bbe0b4b2..85d3d5dca16b 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1191,7 +1191,7 @@ public class OomAdjuster { } for (int i = activeUids.size() - 1; i >= 0; i--) { final UidRecord uidRec = activeUids.valueAt(i); - int uidChange = UidRecord.CHANGE_PROCSTATE; + int uidChange = 0; if (uidRec.getCurProcState() != PROCESS_STATE_NONEXISTENT && (uidRec.getSetProcState() != uidRec.getCurProcState() || uidRec.getSetCapability() != uidRec.getCurCapability() @@ -1219,12 +1219,12 @@ public class OomAdjuster { } } if (uidRec.isIdle() && !uidRec.isSetIdle()) { - uidChange = UidRecord.CHANGE_IDLE; + uidChange |= UidRecord.CHANGE_IDLE; becameIdle.add(uidRec); } } else { if (uidRec.isIdle()) { - uidChange = UidRecord.CHANGE_ACTIVE; + uidChange |= UidRecord.CHANGE_ACTIVE; EventLogTags.writeAmUidActive(uidRec.getUid()); uidRec.setIdle(false); } @@ -1241,6 +1241,9 @@ public class OomAdjuster { if (uidRec.getSetCapability() != uidRec.getCurCapability()) { uidChange |= UidRecord.CHANGE_CAPABILITY; } + if (uidRec.getSetProcState() != uidRec.getCurProcState()) { + uidChange |= UidRecord.CHANGE_PROCSTATE; + } uidRec.setSetProcState(uidRec.getCurProcState()); uidRec.setSetCapability(uidRec.getCurCapability()); uidRec.setSetAllowListed(uidRec.isCurAllowListed()); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 253686c2602d..a8612fd8b190 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -3031,7 +3031,7 @@ public final class ProcessList { Slog.i(TAG_UID_OBSERVERS, "No more processes in " + uidRecord); } mService.enqueueUidChangeLocked(uidRecord, -1, - UidRecord.CHANGE_GONE); + UidRecord.CHANGE_GONE | UidRecord.CHANGE_PROCSTATE); EventLogTags.writeAmUidStopped(uid); mActiveUids.remove(uid); mService.mFgsStartTempAllowList.removeUid(record.info.uid); diff --git a/services/core/java/com/android/server/am/UidObserverController.java b/services/core/java/com/android/server/am/UidObserverController.java index f6a184119bb4..c3a232aac4b5 100644 --- a/services/core/java/com/android/server/am/UidObserverController.java +++ b/services/core/java/com/android/server/am/UidObserverController.java @@ -154,6 +154,9 @@ public class UidObserverController { if ((pendingChange & UidRecord.CHANGE_CAPABILITY) != 0) { currentChange |= UidRecord.CHANGE_CAPABILITY; } + if ((pendingChange & UidRecord.CHANGE_PROCSTATE) != 0) { + currentChange |= UidRecord.CHANGE_PROCSTATE; + } return currentChange; } diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java index 6101e267effc..606e6fc82650 100644 --- a/services/core/java/com/android/server/am/UidRecord.java +++ b/services/core/java/com/android/server/am/UidRecord.java @@ -117,13 +117,16 @@ public final class UidRecord { */ final Object networkStateLock = new Object(); - static final int CHANGE_PROCSTATE = 0; - static final int CHANGE_GONE = 1<<0; - static final int CHANGE_IDLE = 1<<1; - static final int CHANGE_ACTIVE = 1<<2; - static final int CHANGE_CACHED = 1<<3; - static final int CHANGE_UNCACHED = 1<<4; - static final int CHANGE_CAPABILITY = 1<<5; + /* + * Change bitmask flags. + */ + static final int CHANGE_GONE = 1 << 0; + static final int CHANGE_IDLE = 1 << 1; + static final int CHANGE_ACTIVE = 1 << 2; + static final int CHANGE_CACHED = 1 << 3; + static final int CHANGE_UNCACHED = 1 << 4; + static final int CHANGE_CAPABILITY = 1 << 5; + static final int CHANGE_PROCSTATE = 1 << 31; // Keep the enum lists in sync private static int[] ORIG_ENUMS = new int[] { @@ -133,6 +136,7 @@ public final class UidRecord { CHANGE_CACHED, CHANGE_UNCACHED, CHANGE_CAPABILITY, + CHANGE_PROCSTATE, }; private static int[] PROTO_ENUMS = new int[] { UidRecordProto.CHANGE_GONE, @@ -141,6 +145,7 @@ public final class UidRecord { UidRecordProto.CHANGE_CACHED, UidRecordProto.CHANGE_UNCACHED, UidRecordProto.CHANGE_CAPABILITY, + UidRecordProto.CHANGE_PROCSTATE, }; // UidObserverController is the only thing that should modify this. @@ -417,6 +422,12 @@ public final class UidRecord { } sb.append("uncached"); } + if ((mLastReportedChange & CHANGE_PROCSTATE) != 0) { + if (printed) { + sb.append("|"); + } + sb.append("procstate"); + } } sb.append(" procs:"); sb.append(mNumProcs); |