diff options
author | Eric Laurent <elaurent@google.com> | 2010-06-30 19:41:56 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2010-07-01 16:23:34 -0700 |
commit | c03befe3d62eb2a3e1d56fec0ca188a6094d53dd (patch) | |
tree | 8786b553e993ef0b2e091b9b024e770256f6a4ef /media | |
parent | d581484ef8fac80c15ebf652e66f918374df5109 (diff) | |
download | frameworks_base-c03befe3d62eb2a3e1d56fec0ca188a6094d53dd.zip frameworks_base-c03befe3d62eb2a3e1d56fec0ca188a6094d53dd.tar.gz frameworks_base-c03befe3d62eb2a3e1d56fec0ca188a6094d53dd.tar.bz2 |
Fix issue 2811538: System server crash when disconnecting BT headset after using SCO off call.
Problem:
When the bluetooth device is removed, the AudioService clears all active SCO connections
and unlinks from the client application's binder interface death.
The problem is that the unlinking is done even if no more connections are active for a given client,
which throws a runtime exception that is not catched causing the system server to crash.
The fix consists in calling unlinkToDeath() in ScoClient.clearCount() only if the number of
active SCO connections for this client is not 0. The NoSuchElementException exception is also
catched when calling unlinkToDeath()
Change-Id: I7086424301fc63a5666da61c38169349d3e078f4
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioService.java | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 5c278d9..08fc782 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -16,6 +16,7 @@ package android.media; +import java.util.NoSuchElementException; import android.app.ActivityManagerNative; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -1016,7 +1017,11 @@ public class AudioService extends IAudioService.Stub { } else { mStartcount--; if (mStartcount == 0) { - mCb.unlinkToDeath(this, 0); + try { + mCb.unlinkToDeath(this, 0); + } catch (NoSuchElementException e) { + Log.w(TAG, "decCount() going to 0 but not registered to binder"); + } } requestScoState(BluetoothHeadset.AUDIO_STATE_DISCONNECTED); } @@ -1025,8 +1030,14 @@ public class AudioService extends IAudioService.Stub { public void clearCount(boolean stopSco) { synchronized(mScoClients) { + if (mStartcount != 0) { + try { + mCb.unlinkToDeath(this, 0); + } catch (NoSuchElementException e) { + Log.w(TAG, "clearCount() mStartcount: "+mStartcount+" != 0 but not registered to binder"); + } + } mStartcount = 0; - mCb.unlinkToDeath(this, 0); if (stopSco) { requestScoState(BluetoothHeadset.AUDIO_STATE_DISCONNECTED); } |