summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2023-04-18 10:08:09 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-04-18 10:08:09 +0000
commit009defe3cb16b0418c7a948b0a1ae8f2ff74b1e5 (patch)
tree31d96a67bdef1113a3761386b02982c70bef0b90
parentf247d365ed1135064dd7791de4bbba07cd3ac050 (diff)
parent78fe2d8e4207ba556d46290921235a5518a66e01 (diff)
Merge "Invoke service connection consumer outside the object lock" into udc-dev
-rw-r--r--services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java8
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java5
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]);