From 64ece0e5823cf21842d7679a55d5f5c124a12a03 Mon Sep 17 00:00:00 2001 From: Gurpreet Ghai Date: Wed, 10 Aug 2016 15:14:40 +0530 Subject: [PATCH] Fix ANR due to long wait for synchronization lock Use Case: Repeated BT ON/OFF Failure: ANR occurs due to UI wait for long time waiting to acquire thread lock. Steps: Repeated BT ON/OFF Root Cause: The synchronized function that updates state also read paired devices as an additional operation. When the number of devices is cached list is large, the block time for other threads waiting for same lock tends to increase causing ANR. Fix: Limited the synchronized block to the part where actual update of local state takes place. Test: SNS Testing Bug: 35412140 Change-Id: I69ff9f8a032b3772bf3d048d8db70181319ad31d --- .../settingslib/bluetooth/LocalBluetoothAdapter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) mode change 100755 => 100644 packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java old mode 100755 new mode 100644 index cda4e454fe74e..5f7ba586fbad8 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java @@ -194,8 +194,13 @@ public class LocalBluetoothAdapter { return mState; } - synchronized void setBluetoothStateInt(int state) { - mState = state; + void setBluetoothStateInt(int state) { + synchronized(this) { + if (mState == state) { + return; + } + mState = state; + } if (state == BluetoothAdapter.STATE_ON) { // if mProfileManager hasn't been constructed yet, it will