diff options
| author | 2023-04-18 10:08:09 +0000 | |
|---|---|---|
| committer | 2023-04-18 10:08:09 +0000 | |
| commit | 009defe3cb16b0418c7a948b0a1ae8f2ff74b1e5 (patch) | |
| tree | 31d96a67bdef1113a3761386b02982c70bef0b90 | |
| parent | f247d365ed1135064dd7791de4bbba07cd3ac050 (diff) | |
| parent | 78fe2d8e4207ba556d46290921235a5518a66e01 (diff) | |
Merge "Invoke service connection consumer outside the object lock" into udc-dev
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java | 8 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 5 |
2 files changed, 9 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java index 5f56af7fd4e0..1208b6ef396f 100644 --- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java +++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java @@ -99,13 +99,15 @@ public class ActivityServiceConnectionsHolder<T> { } public void forEachConnection(Consumer<T> consumer) { + final ArraySet<T> connections; synchronized (mActivity) { if (mConnections == null || mConnections.isEmpty()) { return; } - for (int i = mConnections.size() - 1; i >= 0; i--) { - consumer.accept(mConnections.valueAt(i)); - } + connections = new ArraySet<>(mConnections); + } + for (int i = connections.size() - 1; i >= 0; i--) { + consumer.accept(connections.valueAt(i)); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 8f2b470908c4..0033e3e368c6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2399,7 +2399,10 @@ public class ActivityRecordTests extends WindowTestsBase { holder.addConnection(connection); assertTrue(holder.isActivityVisible()); final int[] count = new int[1]; - final Consumer<Object> c = conn -> count[0]++; + final Consumer<Object> c = conn -> { + count[0]++; + assertFalse(Thread.holdsLock(activity)); + }; holder.forEachConnection(c); assertEquals(1, count[0]); |