summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Atneya Nair <atneya@google.com> 2022-07-26 15:24:16 -0700
committer Mikhail Naganov <mnaganov@google.com> 2022-09-12 16:54:29 +0000
commitf85e77863e2d3c5e5747116ce2a20c40a38fe02f (patch)
tree719cb16f4bbda750236be350cd20f11476d66166
parentdb3fb60b2b7a3456323d2cd627d091a293e70afd (diff)
Prevent modifying mAudioPolicies during iteration
Calling release on a policy from mAudioPolicies removes a key from the map, causing a ConcurrentHashException. Defer releases till after iteration completes. Test: Compiles Bug: 240314224 Change-Id: I83fa969204d8a9c6ac7bae40f5be57a92813f6be (cherry picked from commit 6f837517a2a9106deac7bb076db1cf78f72e0438) Merged-In: I83fa969204d8a9c6ac7bae40f5be57a92813f6be
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java7
1 files changed, 5 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index a51b187e8634..56874f74afb1 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -1517,6 +1517,7 @@ public class AudioService extends IAudioService.Stub
}
synchronized (mAudioPolicies) {
+ ArrayList<AudioPolicyProxy> invalidProxies = new ArrayList<>();
for (AudioPolicyProxy policy : mAudioPolicies.values()) {
final int status = policy.connectMixes();
if (status != AudioSystem.SUCCESS) {
@@ -1524,7 +1525,7 @@ public class AudioService extends IAudioService.Stub
Log.e(TAG, "onAudioServerDied: error "
+ AudioSystem.audioSystemErrorToString(status)
+ " when connecting mixes for policy " + policy.toLogFriendlyString());
- policy.release();
+ invalidProxies.add(policy);
} else {
final int deviceAffinitiesStatus = policy.setupDeviceAffinities();
if (deviceAffinitiesStatus != AudioSystem.SUCCESS) {
@@ -1532,10 +1533,12 @@ public class AudioService extends IAudioService.Stub
+ AudioSystem.audioSystemErrorToString(deviceAffinitiesStatus)
+ " when connecting device affinities for policy "
+ policy.toLogFriendlyString());
- policy.release();
+ invalidProxies.add(policy);
}
}
}
+ invalidProxies.forEach((policy) -> policy.release());
+
}
// Restore capture policies