diff options
Diffstat (limited to 'services/core/java/com/android/server/AlarmManagerService.java')
-rw-r--r-- | services/core/java/com/android/server/AlarmManagerService.java | 61 |
1 files changed, 24 insertions, 37 deletions
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 1433490..5875ca9 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -74,6 +74,8 @@ import java.util.Locale; import java.util.Random; import java.util.TimeZone; import java.util.TreeSet; +import java.util.Timer; +import java.util.TimerTask; import static android.app.AlarmManager.RTC_WAKEUP; import static android.app.AlarmManager.RTC; @@ -127,6 +129,7 @@ class AlarmManagerService extends SystemService { private final ArrayList<Integer> mTriggeredUids = new ArrayList<Integer>(); private final ArrayList<Integer> mBlockedUids = new ArrayList<Integer>(); + private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec. long mNativeData; private long mNextWakeup; @@ -1250,16 +1253,9 @@ class AlarmManagerService extends SystemService { synchronized(mLock) { if(isBlocked) { mBlockedUids.add(new Integer(uid)); - if (checkReleaseWakeLock()) { - /* all the uids for which the alarms are triggered - * are either blocked or have called onSendFinished. - */ - if (mWakeLock.isHeld()) { - mWakeLock.release(); - if (localLOGV) - Slog.v(TAG, "AM WakeLock Released Internally in updateBlockedUids"); - } - } + Timer checkBlockedUidTimer = new Timer(); + checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask(uid), + BLOCKED_UID_CHECK_INTERVAL); } else { mBlockedUids.clear(); } @@ -1267,6 +1263,24 @@ class AlarmManagerService extends SystemService { } }; + class CheckBlockedUidTimerTask extends TimerTask { + private int mUid; + CheckBlockedUidTimerTask(int uid) { + mUid = uid; + } + @Override + public void run(){ + if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) { + if (mWakeLock.isHeld()) { + mWakeLock.release(); + if (localLOGV) + Slog.v(TAG, "AM WakeLock Released Internally!!"); + return; + } + } + return; + } + } void dumpImpl(PrintWriter pw) { synchronized (mLock) { pw.println("Current Alarm Manager state:"); @@ -1745,20 +1759,6 @@ class AlarmManagerService extends SystemService { } } - boolean checkReleaseWakeLock() { - if (mTriggeredUids.size() == 0 || mBlockedUids.size() == 0) - return false; - - int uid; - for (int i = 0; i < mTriggeredUids.size(); i++) { - uid = mTriggeredUids.get(i); - if (!mBlockedUids.contains(uid)) { - return false; - } - } - return true; - } - private void removeLocked(PendingIntent operation) { boolean didRemove = false; for (int i = mAlarmBatches.size() - 1; i >= 0; i--) { @@ -2277,12 +2277,6 @@ class AlarmManagerService extends SystemService { mInFlight.add(inflight); mBroadcastRefCount++; mTriggeredUids.add(new Integer(alarm.uid)); - if (checkReleaseWakeLock()) { - if (mWakeLock.isHeld()) { - mWakeLock.release(); - if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally deliverAlarms"); - } - } if (allowWhileIdle) { // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. @@ -2839,13 +2833,6 @@ class AlarmManagerService extends SystemService { mBroadcastRefCount--; mTriggeredUids.remove(new Integer(uid)); - if (checkReleaseWakeLock()) { - if (mWakeLock.isHeld()) { - mWakeLock.release(); - if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally onSendFinish"); - } - } - if (mBroadcastRefCount == 0) { if (mWakeLock.isHeld()) { mWakeLock.release(); |