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
This commit is contained in:
Atneya Nair 2022-07-26 15:24:16 -07:00 committed by Mikhail Naganov
parent db3fb60b2b
commit f85e77863e

View File

@ -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