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

Commit 9319a726 authored by Andy Hung's avatar Andy Hung
Browse files

AudioFlinger: Use scoped_lock to prevent deadlock

Test: atest AudioTrackTest AudioRecordTest
Test: atest AAudioTests AudioTrackOffloadTest
Test: atest AudioPlaybackCaptureTest
Test: Camera YouTube
Bug: 282945023
Merged-In: I63906b09dcee8ed18202520aa5e823ec2362a327
Change-Id: I63906b09dcee8ed18202520aa5e823ec2362a327
parent 87e82415
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -3023,8 +3023,8 @@ status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output)
                        checkPlaybackThread_l(mPlaybackThreads.keyAt(0));
                if (dstThread != NULL) {
                    // audioflinger lock is held so order of thread lock acquisition doesn't matter
                    audio_utils::lock_guard _dl(dstThread->mutex());
                    audio_utils::lock_guard _sl(playbackThread->mutex());
                    // Use scoped_lock to avoid deadlock order issues with duplicating threads.
                    audio_utils::scoped_lock sl(dstThread->mutex(), playbackThread->mutex());
                    Vector<sp<IAfEffectChain>> effectChains = playbackThread->getEffectChains_l();
                    for (size_t i = 0; i < effectChains.size(); i ++) {
                        moveEffectChain_l(effectChains[i]->sessionId(), playbackThread.get(),
@@ -4285,8 +4285,7 @@ status_t AudioFlinger::moveEffects(audio_session_t sessionId, audio_io_handle_t
        return BAD_VALUE;
    }

    audio_utils::lock_guard _dl(dstThread->mutex());
    audio_utils::lock_guard _sl(srcThread->mutex());
    audio_utils::scoped_lock _ll(dstThread->mutex(), srcThread->mutex());
    return moveEffectChain_l(sessionId, srcThread, dstThread);
}

@@ -4426,8 +4425,7 @@ status_t AudioFlinger::moveAuxEffectToIo(int EffectId,
    const sp<IAfPlaybackThread> thread = threadBase ? threadBase->asIAfPlaybackThread() : nullptr;

    if (EffectId != 0 && thread != 0 && dstThread != thread.get()) {
        audio_utils::lock_guard _dl(dstThread->mutex());
        audio_utils::lock_guard _sl(thread->mutex());
        audio_utils::scoped_lock _ll(dstThread->mutex(), thread->mutex());
        sp<IAfEffectChain> srcChain = thread->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
        sp<IAfEffectChain> dstChain;
        if (srcChain == 0) {