diff options
| author | Jaikumar Ganesh <jaikumar@google.com> | 2011-06-24 09:28:02 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-06-24 09:28:02 -0700 |
| commit | e0ac113b47fa9755ab02fd7b219c411d2cb8e033 (patch) | |
| tree | 730b078393115485a31efd20ecb53bda4965a539 /core/java/android | |
| parent | a6bdb4c7710404ad973854cc2a496430f59f831e (diff) | |
| parent | 5312af0c95d781a00298c6f919f95f6f6f442099 (diff) | |
Merge "Fix excessive locking synchronization leading to deadlocks."
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/server/BluetoothDeviceProperties.java | 112 |
1 files changed, 62 insertions, 50 deletions
diff --git a/core/java/android/server/BluetoothDeviceProperties.java b/core/java/android/server/BluetoothDeviceProperties.java index 3dc53d7c0fc8..fe3ef793e8cd 100644 --- a/core/java/android/server/BluetoothDeviceProperties.java +++ b/core/java/android/server/BluetoothDeviceProperties.java @@ -35,43 +35,45 @@ class BluetoothDeviceProperties { mService = service; } - synchronized Map<String, String> addProperties(String address, - String[] properties) { + Map<String, String> addProperties(String address, String[] properties) { /* * We get a DeviceFound signal every time RSSI changes or name changes. * Don't create a new Map object every time. */ - Map<String, String> propertyValues = mPropertiesMap.get(address); - if (propertyValues == null) { - propertyValues = new HashMap<String, String>(); - } + Map<String, String> propertyValues; + synchronized(mPropertiesMap) { + propertyValues = mPropertiesMap.get(address); + if (propertyValues == null) { + propertyValues = new HashMap<String, String>(); + } - for (int i = 0; i < properties.length; i++) { - String name = properties[i]; - String newValue = null; - int len; - if (name == null) { - Log.e(TAG, "Error: Remote Device Property at index " + for (int i = 0; i < properties.length; i++) { + String name = properties[i]; + String newValue = null; + int len; + if (name == null) { + Log.e(TAG, "Error: Remote Device Property at index " + i + " is null"); - continue; - } - if (name.equals("UUIDs") || name.equals("Nodes")) { - StringBuilder str = new StringBuilder(); - len = Integer.valueOf(properties[++i]); - for (int j = 0; j < len; j++) { - str.append(properties[++i]); - str.append(","); + continue; } - if (len > 0) { - newValue = str.toString(); + if (name.equals("UUIDs") || name.equals("Nodes")) { + StringBuilder str = new StringBuilder(); + len = Integer.valueOf(properties[++i]); + for (int j = 0; j < len; j++) { + str.append(properties[++i]); + str.append(","); + } + if (len > 0) { + newValue = str.toString(); + } + } else { + newValue = properties[++i]; } - } else { - newValue = properties[++i]; - } - propertyValues.put(name, newValue); + propertyValues.put(name, newValue); + } + mPropertiesMap.put(address, propertyValues); } - mPropertiesMap.put(address, propertyValues); // We have added a new remote device or updated its properties. // Also update the serviceChannel cache. @@ -79,46 +81,56 @@ class BluetoothDeviceProperties { return propertyValues; } - synchronized void setProperty(String address, String name, String value) { - Map <String, String> propVal = mPropertiesMap.get(address); - if (propVal != null) { - propVal.put(name, value); - mPropertiesMap.put(address, propVal); - } else { - Log.e(TAG, "setRemoteDeviceProperty for a device not in cache:" + address); + void setProperty(String address, String name, String value) { + synchronized(mPropertiesMap) { + Map <String, String> propVal = mPropertiesMap.get(address); + if (propVal != null) { + propVal.put(name, value); + mPropertiesMap.put(address, propVal); + } else { + Log.e(TAG, "setRemoteDeviceProperty for a device not in cache:" + address); + } } } - synchronized boolean isInCache(String address) { - return (mPropertiesMap.get(address) != null); + boolean isInCache(String address) { + synchronized (mPropertiesMap) { + return (mPropertiesMap.get(address) != null); + } } - synchronized boolean isEmpty() { - return mPropertiesMap.isEmpty(); + boolean isEmpty() { + synchronized (mPropertiesMap) { + return mPropertiesMap.isEmpty(); + } } - synchronized Set<String> keySet() { - return mPropertiesMap.keySet(); + Set<String> keySet() { + synchronized (mPropertiesMap) { + return mPropertiesMap.keySet(); + } } - synchronized String getProperty(String address, String property) { - Map<String, String> properties = mPropertiesMap.get(address); - if (properties != null) { - return properties.get(property); - } else { - // Query for remote device properties, again. - // We will need to reload the cache when we switch Bluetooth on / off - // or if we crash. - properties = updateCache(address); + String getProperty(String address, String property) { + synchronized(mPropertiesMap) { + Map<String, String> properties = mPropertiesMap.get(address); if (properties != null) { return properties.get(property); + } else { + // Query for remote device properties, again. + // We will need to reload the cache when we switch Bluetooth on / off + // or if we crash. + properties = updateCache(address); + if (properties != null) { + return properties.get(property); + } } } Log.e(TAG, "getRemoteDeviceProperty: " + property + " not present: " + address); return null; } - synchronized Map<String, String> updateCache(String address) { + Map<String, String> updateCache(String address) { String[] propValues = mService.getRemoteDeviceProperties(address); if (propValues != null) { return addProperties(address, propValues); |
