Don't take a lock on the UI thread
Bug: 72945360
Test: atest CtsAlarmManagerTestCases
Test: atest CtsBatterySavingTestCases
Test: atest $ANDROID_BUILD_TOP/frameworks/base/services/tests/servicestests/src/com/android/server/ForceAppStandbyTrackerTest.java
Change-Id: Ifbc72acadf512d70625bbf4e08e960349eeae4d8
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index f49cd67..64bbbb9 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -3470,10 +3470,15 @@
public static final int REPORT_ALARMS_ACTIVE = 4;
public static final int APP_STANDBY_BUCKET_CHANGED = 5;
public static final int APP_STANDBY_PAROLE_CHANGED = 6;
+ public static final int REMOVE_FOR_STOPPED = 7;
public AlarmHandler() {
}
+ public void postRemoveForStopped(int uid) {
+ obtainMessage(REMOVE_FOR_STOPPED, uid, 0).sendToTarget();
+ }
+
public void handleMessage(Message msg) {
switch (msg.what) {
case ALARM_EVENT: {
@@ -3528,6 +3533,12 @@
}
break;
+ case REMOVE_FOR_STOPPED:
+ synchronized (mLock) {
+ removeForStoppedLocked(msg.arg1);
+ }
+ break;
+
default:
// nope, just ignore it
break;
@@ -3717,10 +3728,8 @@
}
@Override public void onUidGone(int uid, boolean disabled) {
- synchronized (mLock) {
- if (disabled) {
- removeForStoppedLocked(uid);
- }
+ if (disabled) {
+ mHandler.postRemoveForStopped(uid);
}
}
@@ -3728,10 +3737,8 @@
}
@Override public void onUidIdle(int uid, boolean disabled) {
- synchronized (mLock) {
- if (disabled) {
- removeForStoppedLocked(uid);
- }
+ if (disabled) {
+ mHandler.postRemoveForStopped(uid);
}
}