AudioService: fix deallock setBluetoothScoOn vs setMode
In AudioService:
setBluetoothScoOn()
> setBluetoothScoOnInt()
> synchronized(mSettingsLock)
> muteRingerModeStreams()
> synchronized (VolumeStreamState.class)
vs
setMode()
> setModeInt()
> synchronized (mSettingsLock)
> synchronized (VolumeStreamState.class)
The issue comes from setBluetoothScoOnInt() releasing the lock
on mSettingsLock before calling muteRingerModeStreams(). This
breaks the expected lock ordering in AudioService, where
mSettingsLock must be locked before VolumeStreamState.class.
Bug: 109746821
Test: see bug
Change-Id: I853ca60781efc506626b6345f27da701655ac359
This commit is contained in:
@@ -2623,6 +2623,7 @@ public class AudioService extends IAudioService.Stub
|
||||
broadcastRingerMode(AudioManager.RINGER_MODE_CHANGED_ACTION, ringerMode);
|
||||
}
|
||||
|
||||
@GuardedBy("mSettingsLock")
|
||||
private void muteRingerModeStreams() {
|
||||
// Mute stream if not previously muted by ringer mode and (ringer mode
|
||||
// is not RINGER_MODE_NORMAL OR stream is zen muted) and stream is affected by ringer mode.
|
||||
@@ -2710,10 +2711,9 @@ public class AudioService extends IAudioService.Stub
|
||||
synchronized(mSettingsLock) {
|
||||
change = mRingerMode != ringerMode;
|
||||
mRingerMode = ringerMode;
|
||||
muteRingerModeStreams();
|
||||
}
|
||||
|
||||
muteRingerModeStreams();
|
||||
|
||||
// Post a persist ringer mode msg
|
||||
if (persist) {
|
||||
sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE,
|
||||
|
||||
Reference in New Issue
Block a user