UsageStats: Avoid holding main lock when notifying callbacks
Make sure informing the callbacks without holding the main
lock of the UsageStatsService.
Bug: 310142962
Bug: 302675504
Test: build/trace.
Change-Id: I4e9701b6a5c1657dc4303e22de5d148a68248398
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index f64ab22..63de41f 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -206,6 +206,7 @@
static final int MSG_NOTIFY_ESTIMATED_LAUNCH_TIMES_CHANGED = 9;
static final int MSG_UID_REMOVED = 10;
static final int MSG_USER_STARTED = 11;
+ static final int MSG_NOTIFY_USAGE_EVENT_LISTENER = 12;
private final Object mLock = new Object();
private Handler mHandler;
@@ -315,6 +316,16 @@
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
return true;
}
+ case MSG_NOTIFY_USAGE_EVENT_LISTENER: {
+ final int userId = msg.arg1;
+ final Event event = (Event) msg.obj;
+ synchronized (mUsageEventListeners) {
+ final int size = mUsageEventListeners.size();
+ for (int i = 0; i < size; ++i) {
+ mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
+ }
+ }
+ }
}
return false;
};
@@ -532,9 +543,6 @@
}
reportEvent(unlockEvent, userId);
- mIoHandler.obtainMessage(MSG_HANDLE_LAUNCH_TIME_ON_USER_UNLOCK,
- userId, 0).sendToTarget();
-
// Remove all the stats stored in system DE.
deleteRecursively(new File(Environment.getDataSystemDeDirectory(userId), "usagestats"));
@@ -546,6 +554,8 @@
userService.persistActiveStats();
}
}
+
+ mIoHandler.obtainMessage(MSG_HANDLE_LAUNCH_TIME_ON_USER_UNLOCK, userId, 0).sendToTarget();
}
/**
@@ -1240,12 +1250,7 @@
service.reportEvent(event);
}
- synchronized (mUsageEventListeners) {
- final int size = mUsageEventListeners.size();
- for (int i = 0; i < size; ++i) {
- mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
- }
- }
+ mIoHandler.obtainMessage(MSG_NOTIFY_USAGE_EVENT_LISTENER, userId, 0, event).sendToTarget();
}
private String getUsageSourcePackage(Event event) {