summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2016-05-24 23:17:36 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-05-24 23:17:36 +0000
commit1c3b50a00ea3ab23569a697ba1f1e756098a01a2 (patch)
treec64f57bf229c6c824b9f4d494e75a6609e8713d4 /core/java
parentc49d21f9c4ac128bf150ba7c78c0c416640b8f77 (diff)
parent2b016a171148a05fe4081958cd6ae297ab76c0d0 (diff)
Merge "Reduced the impact of "synchronized" statements"
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java367
1 files changed, 235 insertions, 132 deletions
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index ceb7e91bf729..15b16f73144a 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -53,6 +53,8 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* Represents the local device Bluetooth adapter. The {@link BluetoothAdapter}
@@ -487,6 +489,8 @@ public final class BluetoothAdapter {
private final IBluetoothManager mManagerService;
private IBluetooth mService;
+ private final ReentrantReadWriteLock mServiceLock =
+ new ReentrantReadWriteLock();
private final Object mLock = new Object();
private final Map<LeScanCallback, ScanCallback> mLeScanClients;
@@ -521,8 +525,13 @@ public final class BluetoothAdapter {
throw new IllegalArgumentException("bluetooth manager service is null");
}
try {
+ mServiceLock.writeLock().lock();
mService = managerService.registerAdapter(mManagerCallback);
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.writeLock().unlock();
+ }
mManagerService = managerService;
mLeScanClients = new HashMap<LeScanCallback, ScanCallback>();
mToken = new Binder();
@@ -609,10 +618,14 @@ public final class BluetoothAdapter {
@RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean isEnabled() {
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.isEnabled();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isEnabled();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+
return false;
}
@@ -643,12 +656,12 @@ public final class BluetoothAdapter {
* or OFF if BT is in BLE_ON state
*/
private void notifyUserAction(boolean enable) {
- if (mService == null) {
- Log.e(TAG, "mService is null");
- return;
- }
-
try {
+ mServiceLock.readLock().lock();
+ if (mService == null) {
+ Log.e(TAG, "mService is null");
+ return;
+ }
if (enable) {
mService.onLeServiceUp(); //NA:TODO implementation pending
} else {
@@ -656,6 +669,8 @@ public final class BluetoothAdapter {
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
}
@@ -787,26 +802,28 @@ public final class BluetoothAdapter {
@RequiresPermission(Manifest.permission.BLUETOOTH)
@AdapterState
public int getState() {
+ int state = BluetoothAdapter.STATE_OFF;
+
try {
- synchronized(mManagerCallback) {
- if (mService != null)
- {
- int state= mService.getState();
- if (VDBG) Log.d(TAG, "" + hashCode() + ": getState(). Returning " + state);
- //consider all internal states as OFF
- if (state == BluetoothAdapter.STATE_BLE_ON
- || state == BluetoothAdapter.STATE_BLE_TURNING_ON
- || state == BluetoothAdapter.STATE_BLE_TURNING_OFF) {
- if (VDBG) Log.d(TAG, "Consider internal state as OFF");
- state = BluetoothAdapter.STATE_OFF;
- }
- return state;
- }
- // TODO(BT) there might be a small gap during STATE_TURNING_ON that
- // mService is null, handle that case
+ mServiceLock.readLock().lock();
+ if (mService != null) {
+ state = mService.getState();
}
- } catch (RemoteException e) {Log.e(TAG, "", e);}
- return STATE_OFF;
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+
+ // Consider all internal states as OFF
+ if (state == BluetoothAdapter.STATE_BLE_ON
+ || state == BluetoothAdapter.STATE_BLE_TURNING_ON
+ || state == BluetoothAdapter.STATE_BLE_TURNING_OFF) {
+ if (VDBG) Log.d(TAG, "Consider internal state as OFF");
+ state = BluetoothAdapter.STATE_OFF;
+ }
+ if (VDBG) Log.d(TAG, "" + hashCode() + ": getState(). Returning " + state);
+ return state;
}
/**
@@ -829,19 +846,21 @@ public final class BluetoothAdapter {
@RequiresPermission(Manifest.permission.BLUETOOTH)
@AdapterState
public int getLeState() {
+ int state = BluetoothAdapter.STATE_OFF;
+
try {
- synchronized(mManagerCallback) {
- if (mService != null)
- {
- int state= mService.getState();
- if (VDBG) Log.d(TAG,"getLeState() returning " + state);
- return state;
- }
+ mServiceLock.readLock().lock();
+ if (mService != null) {
+ state = mService.getState();
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
- return BluetoothAdapter.STATE_OFF;
+
+ if (VDBG) Log.d(TAG,"getLeState() returning " + state);
+ return state;
}
boolean getLeAccess() {
@@ -883,16 +902,21 @@ public final class BluetoothAdapter {
*/
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean enable() {
- int state = STATE_OFF;
- if (isEnabled() == true){
+ int state = BluetoothAdapter.STATE_OFF;
+ if (isEnabled() == true) {
if (DBG) Log.d(TAG, "enable(): BT is already enabled..!");
return true;
}
- //Use service interface to get the exact state
- if (mService != null) {
- try {
- state = mService.getState();
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ // Use service interface to get the exact state
+ try {
+ mServiceLock.readLock().lock();
+ if (mService != null) {
+ state = mService.getState();
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
if (state == BluetoothAdapter.STATE_BLE_ON) {
@@ -997,10 +1021,13 @@ public final class BluetoothAdapter {
*/
public boolean configHciSnoopLog(boolean enable) {
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.configHciSnoopLog(enable);
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.configHciSnoopLog(enable);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1016,12 +1043,16 @@ public final class BluetoothAdapter {
*/
public boolean factoryReset() {
try {
+ mServiceLock.readLock().lock();
if (mService != null) {
return mService.factoryReset();
- } else {
- SystemProperties.set("persist.bluetooth.factoryreset", "true");
}
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ SystemProperties.set("persist.bluetooth.factoryreset", "true");
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1036,10 +1067,13 @@ public final class BluetoothAdapter {
public ParcelUuid[] getUuids() {
if (getState() != STATE_ON) return null;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.getUuids();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getUuids();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return null;
}
@@ -1062,10 +1096,13 @@ public final class BluetoothAdapter {
public boolean setName(String name) {
if (getState() != STATE_ON) return false;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.setName(name);
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.setName(name);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1090,10 +1127,13 @@ public final class BluetoothAdapter {
public int getScanMode() {
if (getState() != STATE_ON) return SCAN_MODE_NONE;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.getScanMode();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getScanMode();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return SCAN_MODE_NONE;
}
@@ -1128,10 +1168,13 @@ public final class BluetoothAdapter {
public boolean setScanMode(@ScanMode int mode, int duration) {
if (getState() != STATE_ON) return false;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.setScanMode(mode, duration);
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.setScanMode(mode, duration);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1146,10 +1189,13 @@ public final class BluetoothAdapter {
public int getDiscoverableTimeout() {
if (getState() != STATE_ON) return -1;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.getDiscoverableTimeout();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getDiscoverableTimeout();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return -1;
}
@@ -1157,10 +1203,13 @@ public final class BluetoothAdapter {
public void setDiscoverableTimeout(int timeout) {
if (getState() != STATE_ON) return;
try {
- synchronized(mManagerCallback) {
- if (mService != null) mService.setDiscoverableTimeout(timeout);
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) mService.setDiscoverableTimeout(timeout);
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
}
/**
@@ -1197,10 +1246,13 @@ public final class BluetoothAdapter {
public boolean startDiscovery() {
if (getState() != STATE_ON) return false;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.startDiscovery();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.startDiscovery();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1225,10 +1277,13 @@ public final class BluetoothAdapter {
public boolean cancelDiscovery() {
if (getState() != STATE_ON) return false;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.cancelDiscovery();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.cancelDiscovery();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1255,10 +1310,13 @@ public final class BluetoothAdapter {
public boolean isDiscovering() {
if (getState() != STATE_ON) return false;
try {
- synchronized(mManagerCallback) {
- if (mService != null ) return mService.isDiscovering();
- }
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isDiscovering();
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return false;
}
@@ -1270,9 +1328,12 @@ public final class BluetoothAdapter {
public boolean isMultipleAdvertisementSupported() {
if (getState() != STATE_ON) return false;
try {
- return mService.isMultiAdvertisementSupported();
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isMultiAdvertisementSupported();
} catch (RemoteException e) {
Log.e(TAG, "failed to get isMultipleAdvertisementSupported, error: ", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return false;
}
@@ -1305,9 +1366,12 @@ public final class BluetoothAdapter {
public boolean isPeripheralModeSupported() {
if (getState() != STATE_ON) return false;
try {
- return mService.isPeripheralModeSupported();
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isPeripheralModeSupported();
} catch (RemoteException e) {
Log.e(TAG, "failed to get peripheral mode capability: ", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return false;
}
@@ -1320,9 +1384,12 @@ public final class BluetoothAdapter {
public boolean isOffloadedFilteringSupported() {
if (!getLeAccess()) return false;
try {
- return mService.isOffloadedFilteringSupported();
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isOffloadedFilteringSupported();
} catch (RemoteException e) {
Log.e(TAG, "failed to get isOffloadedFilteringSupported, error: ", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return false;
}
@@ -1335,9 +1402,12 @@ public final class BluetoothAdapter {
public boolean isOffloadedScanBatchingSupported() {
if (!getLeAccess()) return false;
try {
- return mService.isOffloadedScanBatchingSupported();
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.isOffloadedScanBatchingSupported();
} catch (RemoteException e) {
Log.e(TAG, "failed to get isOffloadedScanBatchingSupported, error: ", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return false;
}
@@ -1376,9 +1446,12 @@ public final class BluetoothAdapter {
public BluetoothActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) {
if (getState() != STATE_ON) return null;
try {
+ mServiceLock.readLock().lock();
BluetoothActivityEnergyInfo record;
- if (!mService.isActivityAndEnergyReportingSupported()) {
- return null;
+ if (mService != null) {
+ if (!mService.isActivityAndEnergyReportingSupported()) {
+ return null;
+ }
}
synchronized(this) {
if (updateType == ACTIVITY_ENERGY_INFO_REFRESHED) {
@@ -1396,6 +1469,8 @@ public final class BluetoothAdapter {
Log.e(TAG, "getControllerActivityEnergyInfoCallback wait interrupted: " + e);
} catch (RemoteException e) {
Log.e(TAG, "getControllerActivityEnergyInfoCallback: " + e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return null;
}
@@ -1417,11 +1492,14 @@ public final class BluetoothAdapter {
return toDeviceSet(new BluetoothDevice[0]);
}
try {
- synchronized(mManagerCallback) {
- if (mService != null) return toDeviceSet(mService.getBondedDevices());
- }
+ mServiceLock.readLock().lock();
+ if (mService != null) return toDeviceSet(mService.getBondedDevices());
return toDeviceSet(new BluetoothDevice[0]);
- } catch (RemoteException e) {Log.e(TAG, "", e);}
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return null;
}
@@ -1441,10 +1519,13 @@ public final class BluetoothAdapter {
public int getConnectionState() {
if (getState() != STATE_ON) return BluetoothAdapter.STATE_DISCONNECTED;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.getAdapterConnectionState();
- }
- } catch (RemoteException e) {Log.e(TAG, "getConnectionState:", e);}
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getAdapterConnectionState();
+ } catch (RemoteException e) {
+ Log.e(TAG, "getConnectionState:", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
return BluetoothAdapter.STATE_DISCONNECTED;
}
@@ -1467,11 +1548,12 @@ public final class BluetoothAdapter {
public int getProfileConnectionState(int profile) {
if (getState() != STATE_ON) return BluetoothProfile.STATE_DISCONNECTED;
try {
- synchronized(mManagerCallback) {
- if (mService != null) return mService.getProfileConnectionState(profile);
- }
+ mServiceLock.readLock().lock();
+ if (mService != null) return mService.getProfileConnectionState(profile);
} catch (RemoteException e) {
Log.e(TAG, "getProfileConnectionState:", e);
+ } finally {
+ mServiceLock.readLock().unlock();
}
return BluetoothProfile.STATE_DISCONNECTED;
}
@@ -1775,7 +1857,9 @@ public final class BluetoothAdapter {
byte[] hash;
byte[] randomizer;
- byte[] ret = mService.readOutOfBandData();
+ byte[] ret = null;
+ mServiceLock.readLock().lock();
+ if (mService != null) mService.readOutOfBandData();
if (ret == null || ret.length != 32) return null;
@@ -1788,7 +1872,12 @@ public final class BluetoothAdapter {
}
return new Pair<byte[], byte[]>(hash, randomizer);
- } catch (RemoteException e) {Log.e(TAG, "", e);}*/
+ } catch (RemoteException e) {
+ Log.e(TAG, "", e);
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ */
return null;
}
@@ -1917,17 +2006,21 @@ public final class BluetoothAdapter {
new IBluetoothManagerCallback.Stub() {
public void onBluetoothServiceUp(IBluetooth bluetoothService) {
if (VDBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService);
- synchronized (mManagerCallback) {
- mService = bluetoothService;
- synchronized (mProxyServiceStateCallbacks) {
- for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){
- try {
- if (cb != null) {
- cb.onBluetoothServiceUp(bluetoothService);
- } else {
- Log.d(TAG, "onBluetoothServiceUp: cb is null!!!");
- }
- } catch (Exception e) { Log.e(TAG,"",e);}
+
+ mServiceLock.writeLock().lock();
+ mService = bluetoothService;
+ mServiceLock.writeLock().unlock();
+
+ synchronized (mProxyServiceStateCallbacks) {
+ for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ) {
+ try {
+ if (cb != null) {
+ cb.onBluetoothServiceUp(bluetoothService);
+ } else {
+ Log.d(TAG, "onBluetoothServiceUp: cb is null!!!");
+ }
+ } catch (Exception e) {
+ Log.e(TAG,"",e);
}
}
}
@@ -1935,20 +2028,24 @@ public final class BluetoothAdapter {
public void onBluetoothServiceDown() {
if (VDBG) Log.d(TAG, "onBluetoothServiceDown: " + mService);
- synchronized (mManagerCallback) {
- mService = null;
- if (mLeScanClients != null) mLeScanClients.clear();
- if (sBluetoothLeAdvertiser != null) sBluetoothLeAdvertiser.cleanup();
- if (sBluetoothLeScanner != null) sBluetoothLeScanner.cleanup();
- synchronized (mProxyServiceStateCallbacks) {
- for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){
- try {
- if (cb != null) {
- cb.onBluetoothServiceDown();
- } else {
- Log.d(TAG, "onBluetoothServiceDown: cb is null!!!");
- }
- } catch (Exception e) { Log.e(TAG,"",e);}
+
+ mServiceLock.writeLock().lock();
+ mService = null;
+ if (mLeScanClients != null) mLeScanClients.clear();
+ if (sBluetoothLeAdvertiser != null) sBluetoothLeAdvertiser.cleanup();
+ if (sBluetoothLeScanner != null) sBluetoothLeScanner.cleanup();
+ mServiceLock.writeLock().unlock();
+
+ synchronized (mProxyServiceStateCallbacks) {
+ for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){
+ try {
+ if (cb != null) {
+ cb.onBluetoothServiceDown();
+ } else {
+ Log.d(TAG, "onBluetoothServiceDown: cb is null!!!");
+ }
+ } catch (Exception e) {
+ Log.e(TAG,"",e);
}
}
}
@@ -2011,11 +2108,17 @@ public final class BluetoothAdapter {
//TODO(BT)
/*
try {
- return mService.changeApplicationBluetoothState(on, new
+ mServiceLock.readLock().lock();
+ if (mService != null) {
+ return mService.changeApplicationBluetoothState(on, new
StateChangeCallbackWrapper(callback), new Binder());
+ }
} catch (RemoteException e) {
Log.e(TAG, "changeBluetoothState", e);
- }*/
+ } finally {
+ mServiceLock.readLock().unlock();
+ }
+ */
return false;
}