From d19ffd4f2ca4130c41dd5f6baddad1830598ecbc Mon Sep 17 00:00:00 2001 From: Prashant Malani Date: Wed, 10 Jun 2015 17:43:49 -0700 Subject: [PATCH] DO NOT MERGE ANYWHERE Revert "Always re-establish kernel alarms when considering new alarm set" This reverts commit c83d3e4b72f8f25bbac39a577f125f0ca04354da. While the above patch does help deal with the issue of "lost" kernel alarms, experiments found it to also cause the unnecessary duplicate setting of non-lost alarms in other devices. This leads to a situation where the CPU constantly tries to sleep, but occasionally keeps failing to do so, because of a collection of these duplicate alarms constantly activating the "alarm" kernel wakeup source , presumably due to them being triggered. These might have accumulated over several iterations when the kernel alarms were set again (via rescheduleKernelAlarmsLocked()). To prevent the CPU thrashing (which heavily drains power on more battery-constrained devices, and increases the number of alarms being set), the aforementioned commit is backed out. Bug: 20136729 Change-Id: I2a189cb303deb78a2faf476b0e789445407f3e11 --- .../core/java/com/android/server/AlarmManagerService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 65a5c23824bdf..a9a756ed928c8 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -1230,8 +1230,7 @@ class AlarmManagerService extends SystemService { if (mAlarmBatches.size() > 0) { final Batch firstWakeup = findFirstWakeupBatchLocked(); final Batch firstBatch = mAlarmBatches.get(0); - // always update the kernel alarms, as a backstop against missed wakeups - if (firstWakeup != null) { + if (firstWakeup != null && mNextWakeup != firstWakeup.start) { mNextWakeup = firstWakeup.start; setLocked(ELAPSED_REALTIME_WAKEUP, firstWakeup.start); } @@ -1244,8 +1243,7 @@ class AlarmManagerService extends SystemService { nextNonWakeup = mNextNonWakeupDeliveryTime; } } - // always update the kernel alarm, as a backstop against missed wakeups - if (nextNonWakeup != 0) { + if (nextNonWakeup != 0 && mNextNonWakeup != nextNonWakeup) { mNextNonWakeup = nextNonWakeup; setLocked(ELAPSED_REALTIME, nextNonWakeup); }