From 8c9ca8004a95fbc97e50d447d31fe9d2d316c423 Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Mon, 26 Apr 2021 18:53:54 -0700 Subject: [PATCH] Removing non-wakeup alarms on user-removed Alarms in mPendingNonWakeupAlarms were left hanging when the user is removed. These would be defunct at the time of delivery, so there is no point in holding on to them. Test: atest AlarmManagerServiceTest Fixes: 130444055 Change-Id: Ib496b26a855304556ed032b957a1c731f2e2ca18 --- .../server/alarm/AlarmManagerService.java | 44 ++----------------- 1 file changed, 3 insertions(+), 41 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index 5554ad27acd84..aafeb48b7c599 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -3363,56 +3363,18 @@ public class AlarmManagerService extends SystemService { void removeUserLocked(int userHandle) { if (userHandle == USER_SYSTEM) { - // If we're told we're removing the system user, ignore it. + Slog.w(TAG, "Ignoring attempt to remove system-user state!"); return; } final Predicate whichAlarms = - (Alarm a) -> UserHandle.getUserId(a.creatorUid) == userHandle; - final ArrayList removedAlarms = mAlarmStore.remove(whichAlarms); - for (final Alarm removed : removedAlarms) { - decrementAlarmCount(removed.uid, 1); - } - final boolean didRemove = !removedAlarms.isEmpty(); + (Alarm a) -> UserHandle.getUserId(a.uid) == userHandle; + removeAlarmsInternalLocked(whichAlarms); - for (int i = mPendingBackgroundAlarms.size() - 1; i >= 0; i--) { - if (UserHandle.getUserId(mPendingBackgroundAlarms.keyAt(i)) == userHandle) { - final ArrayList toRemove = mPendingBackgroundAlarms.valueAt(i); - if (toRemove != null) { - for (int j = 0; j < toRemove.size(); j++) { - decrementAlarmCount(toRemove.get(j).uid, 1); - } - } - mPendingBackgroundAlarms.removeAt(i); - } - } for (int i = mLastPriorityAlarmDispatch.size() - 1; i >= 0; i--) { if (UserHandle.getUserId(mLastPriorityAlarmDispatch.keyAt(i)) == userHandle) { mLastPriorityAlarmDispatch.removeAt(i); } } - if (mNextWakeFromIdle != null && whichAlarms.test(mNextWakeFromIdle)) { - mNextWakeFromIdle = mAlarmStore.getNextWakeFromIdleAlarm(); - if (mPendingIdleUntil != null) { - final boolean updated = mAlarmStore.updateAlarmDeliveries(alarm -> { - if (alarm != mPendingIdleUntil) { - return false; - } - return adjustIdleUntilTime(alarm); - }); - if (updated) { - mAlarmStore.updateAlarmDeliveries( - alarm -> adjustDeliveryTimeBasedOnDeviceIdle(alarm)); - } - } - } - - if (didRemove) { - if (DEBUG_BATCH) { - Slog.v(TAG, "remove(user) changed bounds; rebatching"); - } - rescheduleKernelAlarmsLocked(); - updateNextAlarmClockLocked(); - } } void interactiveStateChangedLocked(boolean interactive) {