Skip to content

Commit c7e7c09

Browse files
Susheel Yadagirihyperb1iss
authored andcommitted
Release alarm wakelock for blocked uid.
If an alarm is triggered for a uid and if the same uid is blocked and onSendFinished is not called for that alarm intent for BLOCKED_UID_CHECK_INTERVAL or greater then release the wakelock as that uid is being blocked by data power manager. Change-Id: Ieb4dbcc81e273e692fc5db45ac75a4a4341e8c2f
1 parent ea876cd commit c7e7c09

1 file changed

Lines changed: 24 additions & 37 deletions

File tree

services/core/java/com/android/server/AlarmManagerService.java

Lines changed: 24 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@
7474
import java.util.Random;
7575
import java.util.TimeZone;
7676
import java.util.TreeSet;
77+
import java.util.Timer;
78+
import java.util.TimerTask;
7779

7880
import static android.app.AlarmManager.RTC_WAKEUP;
7981
import static android.app.AlarmManager.RTC;
@@ -127,6 +129,7 @@ class AlarmManagerService extends SystemService {
127129

128130
private final ArrayList<Integer> mTriggeredUids = new ArrayList<Integer>();
129131
private final ArrayList<Integer> mBlockedUids = new ArrayList<Integer>();
132+
private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec.
130133

131134
long mNativeData;
132135
private long mNextWakeup;
@@ -1250,23 +1253,34 @@ public void updateBlockedUids(int uid, boolean isBlocked) {
12501253
synchronized(mLock) {
12511254
if(isBlocked) {
12521255
mBlockedUids.add(new Integer(uid));
1253-
if (checkReleaseWakeLock()) {
1254-
/* all the uids for which the alarms are triggered
1255-
* are either blocked or have called onSendFinished.
1256-
*/
1257-
if (mWakeLock.isHeld()) {
1258-
mWakeLock.release();
1259-
if (localLOGV)
1260-
Slog.v(TAG, "AM WakeLock Released Internally in updateBlockedUids");
1261-
}
1262-
}
1256+
Timer checkBlockedUidTimer = new Timer();
1257+
checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask(uid),
1258+
BLOCKED_UID_CHECK_INTERVAL);
12631259
} else {
12641260
mBlockedUids.clear();
12651261
}
12661262
}
12671263
}
12681264
};
12691265

1266+
class CheckBlockedUidTimerTask extends TimerTask {
1267+
private int mUid;
1268+
CheckBlockedUidTimerTask(int uid) {
1269+
mUid = uid;
1270+
}
1271+
@Override
1272+
public void run(){
1273+
if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) {
1274+
if (mWakeLock.isHeld()) {
1275+
mWakeLock.release();
1276+
if (localLOGV)
1277+
Slog.v(TAG, "AM WakeLock Released Internally!!");
1278+
return;
1279+
}
1280+
}
1281+
return;
1282+
}
1283+
}
12701284
void dumpImpl(PrintWriter pw) {
12711285
synchronized (mLock) {
12721286
pw.println("Current Alarm Manager state:");
@@ -1745,20 +1759,6 @@ void rescheduleKernelAlarmsLocked() {
17451759
}
17461760
}
17471761

1748-
boolean checkReleaseWakeLock() {
1749-
if (mTriggeredUids.size() == 0 || mBlockedUids.size() == 0)
1750-
return false;
1751-
1752-
int uid;
1753-
for (int i = 0; i < mTriggeredUids.size(); i++) {
1754-
uid = mTriggeredUids.get(i);
1755-
if (!mBlockedUids.contains(uid)) {
1756-
return false;
1757-
}
1758-
}
1759-
return true;
1760-
}
1761-
17621762
private void removeLocked(PendingIntent operation) {
17631763
boolean didRemove = false;
17641764
for (int i = mAlarmBatches.size() - 1; i >= 0; i--) {
@@ -2277,12 +2277,6 @@ void deliverAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED) {
22772277
mInFlight.add(inflight);
22782278
mBroadcastRefCount++;
22792279
mTriggeredUids.add(new Integer(alarm.uid));
2280-
if (checkReleaseWakeLock()) {
2281-
if (mWakeLock.isHeld()) {
2282-
mWakeLock.release();
2283-
if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally deliverAlarms");
2284-
}
2285-
}
22862280

22872281
if (allowWhileIdle) {
22882282
// Record the last time this uid handled an ALLOW_WHILE_IDLE alarm.
@@ -2839,13 +2833,6 @@ public void onSendFinished(PendingIntent pi, Intent intent, int resultCode,
28392833
mBroadcastRefCount--;
28402834
mTriggeredUids.remove(new Integer(uid));
28412835

2842-
if (checkReleaseWakeLock()) {
2843-
if (mWakeLock.isHeld()) {
2844-
mWakeLock.release();
2845-
if (localLOGV) Slog.v(TAG, "AM WakeLock Released Internally onSendFinish");
2846-
}
2847-
}
2848-
28492836
if (mBroadcastRefCount == 0) {
28502837
if (mWakeLock.isHeld()) {
28512838
mWakeLock.release();

0 commit comments

Comments
 (0)