AudioFlinger: Use scoped_lock to prevent deadlock
Test: atest AudioTrackTest AudioRecordTest
Test: atest AAudioTests AudioTrackOffloadTest
Test: atest AudioPlaybackCaptureTest
Test: Camera YouTube
Bug: 282945023
Change-Id: I63906b09dcee8ed18202520aa5e823ec2362a327
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 43163f2..b0348ad 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -3026,8 +3026,8 @@
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(),
@@ -4342,8 +4342,7 @@
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);
}
@@ -4525,8 +4524,7 @@
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) {