From 0288bcb415b063a03d827683a2ff2c31b441509a Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Mon, 19 Sep 2022 23:39:08 +0000 Subject: [PATCH] Handle object in thread-safe manner. Make sure mUsageEventListeners is always accessed while holding an appropriate lock. Bug: 247635314 Test: Android builds Change-Id: Ia649f1724836f09020ae438bbdcfbe45c71b6784 --- .../com/android/server/usage/UsageStatsService.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 046ff663f6c9b..7f5beb1f6cf0b 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 @@ public class UsageStatsService extends SystemService implements final SparseArray mVisibleActivities = new SparseArray(); @GuardedBy("mLock") private final SparseArray mLaunchTimeAlarmQueues = new SparseArray<>(); + @GuardedBy("mUsageEventListeners") // Don't hold the main lock when calling out private final ArraySet mUsageEventListeners = new ArraySet<>(); private final CopyOnWriteArraySet @@ -1189,9 +1190,11 @@ public class UsageStatsService extends SystemService implements 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); + } } } @@ -1682,7 +1685,7 @@ public class UsageStatsService extends SystemService implements * Called via the local interface. */ private void registerListener(@NonNull UsageStatsManagerInternal.UsageEventListener listener) { - synchronized (mLock) { + synchronized (mUsageEventListeners) { mUsageEventListeners.add(listener); } } @@ -1692,7 +1695,7 @@ public class UsageStatsService extends SystemService implements */ private void unregisterListener( @NonNull UsageStatsManagerInternal.UsageEventListener listener) { - synchronized (mLock) { + synchronized (mUsageEventListeners) { mUsageEventListeners.remove(listener); } }