Merge "Handle object in thread-safe manner." into tm-qpr-dev am: cc2b66542b
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19999948
Change-Id: I9c3b7a562aa873d00b5098437d79d4b84411b09a
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 4d4d1ff..a2b5520 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -233,6 +233,7 @@
final SparseArray<ActivityData> mVisibleActivities = new SparseArray();
@GuardedBy("mLock")
private final SparseArray<LaunchTimeAlarmQueue> mLaunchTimeAlarmQueues = new SparseArray<>();
+ @GuardedBy("mUsageEventListeners") // Don't hold the main lock when calling out
private final ArraySet<UsageStatsManagerInternal.UsageEventListener> mUsageEventListeners =
new ArraySet<>();
private final CopyOnWriteArraySet<UsageStatsManagerInternal.EstimatedLaunchTimeChangedListener>
@@ -1181,9 +1182,11 @@
service.reportEvent(event);
}
- final int size = mUsageEventListeners.size();
- for (int i = 0; i < size; ++i) {
- mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
+ synchronized (mUsageEventListeners) {
+ final int size = mUsageEventListeners.size();
+ for (int i = 0; i < size; ++i) {
+ mUsageEventListeners.valueAt(i).onUsageEvent(userId, event);
+ }
}
}
@@ -1674,7 +1677,7 @@
* Called via the local interface.
*/
private void registerListener(@NonNull UsageStatsManagerInternal.UsageEventListener listener) {
- synchronized (mLock) {
+ synchronized (mUsageEventListeners) {
mUsageEventListeners.add(listener);
}
}
@@ -1684,7 +1687,7 @@
*/
private void unregisterListener(
@NonNull UsageStatsManagerInternal.UsageEventListener listener) {
- synchronized (mLock) {
+ synchronized (mUsageEventListeners) {
mUsageEventListeners.remove(listener);
}
}