Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6f837517 authored by Atneya Nair's avatar Atneya Nair
Browse files

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
parent d4384a5f
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -1572,6 +1572,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) {
@@ -1579,7 +1580,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) {
@@ -1587,10 +1588,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