summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlin Radoslavov <pavlin@google.com>2017-05-31 17:26:45 -0700
committerPavlin Radoslavov <pavlin@google.com>2017-06-01 09:04:28 -0700
commit469e9bc6e1aa0cd5dacf51659e32bda38ddb7ab4 (patch)
treec0559a2beed2d3d8dfa2150e51e0cfdb5e7d064b
parentb4650c79c67ba13773724ef4af9a82c1bb7c808c (diff)
downloadBluetooth-469e9bc6e1aa0cd5dacf51659e32bda38ddb7ab4.tar.gz
Improve internal state synchronization of the A2dpStateMachine
* Don't block entering Disconnected state If the mCurrentDevice or mTargetDevice or mIncomingDevice is not null, print an error message and reset the state * Add consistency checks when entering each state: Disconnected, Pending, Connected * Add a missing "synchronized" statement Bug: 62164051 Test: Manual Change-Id: I5856a88e58b42aa55d9075aa507bfa706ea52512 (cherry picked from commit 459978de76c5d152208538f61180e4a790c6e8d9)
-rwxr-xr-xsrc/com/android/bluetooth/a2dp/A2dpStateMachine.java25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/com/android/bluetooth/a2dp/A2dpStateMachine.java b/src/com/android/bluetooth/a2dp/A2dpStateMachine.java
index 2a8b7c0de..888cbae26 100755
--- a/src/com/android/bluetooth/a2dp/A2dpStateMachine.java
+++ b/src/com/android/bluetooth/a2dp/A2dpStateMachine.java
@@ -267,14 +267,22 @@ final class A2dpStateMachine extends StateMachine {
@Override
public void enter() {
log("Enter Disconnected: " + getCurrentMessage().what);
+ if (mCurrentDevice != null || mTargetDevice != null || mIncomingDevice != null) {
+ loge("ERROR: enter() inconsistent state in Disconnected: current = "
+ + mCurrentDevice + " target = " + mTargetDevice + " incoming = "
+ + mIncomingDevice);
+ }
}
@Override
public boolean processMessage(Message message) {
log("Disconnected process message: " + message.what);
if (mCurrentDevice != null || mTargetDevice != null || mIncomingDevice != null) {
- loge("ERROR: current, target, or mIncomingDevice not null in Disconnected");
- return NOT_HANDLED;
+ loge("ERROR: not null state in Disconnected: current = " + mCurrentDevice
+ + " target = " + mTargetDevice + " incoming = " + mIncomingDevice);
+ mCurrentDevice = null;
+ mTargetDevice = null;
+ mIncomingDevice = null;
}
boolean retValue = HANDLED;
@@ -374,6 +382,10 @@ final class A2dpStateMachine extends StateMachine {
@Override
public void enter() {
log("Enter Pending: " + getCurrentMessage().what);
+ if (mTargetDevice != null && mIncomingDevice != null) {
+ loge("ERROR: enter() inconsistent state in Pending: current = " + mCurrentDevice
+ + " target = " + mTargetDevice + " incoming = " + mIncomingDevice);
+ }
}
@Override
@@ -580,6 +592,11 @@ final class A2dpStateMachine extends StateMachine {
removeDeferredMessages(CONNECT);
log("Enter Connected: " + getCurrentMessage().what);
+ if (mTargetDevice != null || mIncomingDevice != null) {
+ loge("ERROR: enter() inconsistent state in Connected: current = " + mCurrentDevice
+ + " target = " + mTargetDevice + " incoming = " + mIncomingDevice);
+ }
+
// Upon connected, the audio starts out as stopped
broadcastAudioState(mCurrentDevice, BluetoothA2dp.STATE_NOT_PLAYING,
BluetoothA2dp.STATE_PLAYING);
@@ -629,7 +646,9 @@ final class A2dpStateMachine extends StateMachine {
BluetoothProfile.STATE_DISCONNECTED);
break;
}
- transitionTo(mPending);
+ synchronized (A2dpStateMachine.this) {
+ transitionTo(mPending);
+ }
}
break;
case STACK_EVENT: