summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2018-06-07 12:28:27 -0700
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-06-12 01:48:42 +0000
commit18424bb7a480883ac54d30303cbbe257e7edf712 (patch)
tree6ad40fdae670eb1bb05f257d4da48b37bd0bfc36
parentb96cfb97ac9b5928673e8f348cb406f46c237d71 (diff)
downloadbase-18424bb7a480883ac54d30303cbbe257e7edf712.tar.gz
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 (cherry picked from commit c106d9f958be76ab14a6724525f39bc3fec03fd2)
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
1 files changed, 2 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 3fd69ee5645c..db5f7ed7cc8a 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -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,