Merge "Invoke service connection consumer outside the object lock" into udc-dev am: 009defe3cb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/22698621

Change-Id: I6082bf922c39368ca0db305cecb5cffd4cc7bd4f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Riddle Hsu
2023-04-18 10:44:20 +00:00
committed by Automerger Merge Worker
2 changed files with 9 additions and 4 deletions

View File

@@ -99,13 +99,15 @@ public class ActivityServiceConnectionsHolder<T> {
} }
public void forEachConnection(Consumer<T> consumer) { public void forEachConnection(Consumer<T> consumer) {
final ArraySet<T> connections;
synchronized (mActivity) { synchronized (mActivity) {
if (mConnections == null || mConnections.isEmpty()) { if (mConnections == null || mConnections.isEmpty()) {
return; return;
} }
for (int i = mConnections.size() - 1; i >= 0; i--) { connections = new ArraySet<>(mConnections);
consumer.accept(mConnections.valueAt(i));
} }
for (int i = connections.size() - 1; i >= 0; i--) {
consumer.accept(connections.valueAt(i));
} }
} }

View File

@@ -2399,7 +2399,10 @@ public class ActivityRecordTests extends WindowTestsBase {
holder.addConnection(connection); holder.addConnection(connection);
assertTrue(holder.isActivityVisible()); assertTrue(holder.isActivityVisible());
final int[] count = new int[1]; 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); holder.forEachConnection(c);
assertEquals(1, count[0]); assertEquals(1, count[0]);