summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Suprabh Shukla <suprabh@google.com> 2025-02-21 16:14:55 -0800
committer Suprabh Shukla <suprabh@google.com> 2025-02-21 16:14:58 -0800
commitcaea55101151f47a33c955b00c685edcc4494c4b (patch)
tree018c70a84fc9726423167d368183f78f5e4bab42
parent73c4873c60327cf1a964255fc230560d1a94a4d8 (diff)
Release alarm wakelock if send fails
Now that we're acquiring a wakelock before we dispatch the alarm to the app, we also need to release it in cases where the dispatch results in an exception, because the only other release point is in the path of alarm completion or timeout. Test: atest FrameworksMockingServicesTests:AlarmManagerServiceTest Flag: com.android.server.alarm.acquire_wakelock_before_send Bug: 397950542 Change-Id: I7f119c51e2377841396efb360b38f51c1ab17915
-rw-r--r--apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java6
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java35
2 files changed, 41 insertions, 0 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 f89b13dce307..0298c1e627ee 100644
--- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java
@@ -5367,6 +5367,9 @@ public class AlarmManagerService extends SystemService {
// to do any wakelock or stats tracking, so we have nothing
// left to do here but go on to the next thing.
mSendFinishCount++;
+ if (Flags.acquireWakelockBeforeSend()) {
+ mWakeLock.release();
+ }
return;
}
} else {
@@ -5404,6 +5407,9 @@ public class AlarmManagerService extends SystemService {
// stats management to do. It threw before we posted the delayed
// timeout message, so we're done here.
mListenerFinishCount++;
+ if (Flags.acquireWakelockBeforeSend()) {
+ mWakeLock.release();
+ }
return;
}
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
index cb52f1849b5b..2a513ae3a8e8 100644
--- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java
@@ -974,6 +974,41 @@ public final class AlarmManagerServiceTest {
}
@Test
+ @EnableFlags(Flags.FLAG_ACQUIRE_WAKELOCK_BEFORE_SEND)
+ public void testWakelockReleasedWhenSendFails() throws Exception {
+ final long triggerTime = mNowElapsedTest + 5000;
+ final PendingIntent alarmPi = getNewMockPendingIntent();
+ setTestAlarm(ELAPSED_REALTIME_WAKEUP, triggerTime, alarmPi);
+
+ doThrow(new PendingIntent.CanceledException("test")).when(alarmPi).send(eq(mMockContext),
+ eq(0), any(Intent.class), any(), any(Handler.class), isNull(), any());
+
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+
+ final InOrder inOrder = Mockito.inOrder(mWakeLock);
+ inOrder.verify(mWakeLock).acquire();
+ inOrder.verify(mWakeLock).release();
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_ACQUIRE_WAKELOCK_BEFORE_SEND)
+ public void testWakelockReleasedOnListenerException() throws Exception {
+ final long triggerTime = mNowElapsedTest + 5000;
+ final IAlarmListener listener = getNewListener(() -> {
+ throw new RuntimeException("test");
+ });
+ setTestAlarmWithListener(ELAPSED_REALTIME_WAKEUP, triggerTime, listener);
+
+ mNowElapsedTest = mTestTimer.getElapsed();
+ mTestTimer.expire();
+
+ final InOrder inOrder = Mockito.inOrder(mWakeLock);
+ inOrder.verify(mWakeLock).acquire();
+ inOrder.verify(mWakeLock).release();
+ }
+
+ @Test
public void testMinFuturityCoreUid() {
setDeviceConfigLong(KEY_MIN_FUTURITY, 10L);
assertEquals(10, mService.mConstants.MIN_FUTURITY);