summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/AlarmManagerService.java
diff options
context:
space:
mode:
Diffstat (limited to 'services/core/java/com/android/server/AlarmManagerService.java')
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java61
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();