OSDN Git Service

Fix race condition when doing GATT discovery
authorJakub Pawlowski <jpawlowski@google.com>
Sat, 12 Dec 2015 06:35:01 +0000 (22:35 -0800)
committerJakub Pawlowski <jpawlowski@google.com>
Sat, 12 Dec 2015 06:51:36 +0000 (22:51 -0800)
Right now if discovery to multiple GATT clients is happening
simultaneously, onSearchComplete will be run only for device that
finishes discovery last, while it should be run for each device.

mSearchQueue is one for all discovery sessions. Instead of checking if
it's empty, we must check if there are no elements for given connId.

Bug: 26038939
Change-Id: I9417cd7be8cab4b808ce7f045861e1adc2055629

src/com/android/bluetooth/gatt/GattService.java
src/com/android/bluetooth/gatt/SearchQueue.java

index 4847c53..376994c 100644 (file)
@@ -2138,7 +2138,20 @@ public class GattService extends ProfileService {
     }
 
     private void continueSearch(int connId, int status) throws RemoteException {
-        if (status == 0 && !mSearchQueue.isEmpty()) {
+
+        // Search is complete when there was error, or nothing more to process
+        if (status != 0 || mSearchQueue.isEmptyFor(connId)) {
+            // In case we complete because of error, clean up
+            // any remaining operations for this connection.
+            mSearchQueue.removeConnId(connId);
+
+            ClientMap.App app = mClientMap.getByConnId(connId);
+            if (app != null) {
+                app.callback.onSearchComplete(mClientMap.addressByConnId(connId), status);
+            }
+        }
+
+        if (!mSearchQueue.isEmpty()) {
             SearchQueue.Entry svc = mSearchQueue.pop();
 
             if (svc.charUuidLsb == 0) {
@@ -2151,11 +2164,6 @@ public class GattService extends ProfileService {
                     svc.srvcInstId, svc.srvcUuidLsb, svc.srvcUuidMsb,
                     svc.charInstId, svc.charUuidLsb, svc.charUuidMsb, 0, 0, 0);
             }
-        } else {
-            ClientMap.App app = mClientMap.getByConnId(connId);
-            if (app != null) {
-                app.callback.onSearchComplete(mClientMap.addressByConnId(connId), status);
-            }
         }
     }
 
index 3064a51..c784415 100644 (file)
@@ -86,6 +86,16 @@ import java.util.List;
         return mEntries.isEmpty();
     }
 
+    boolean isEmptyFor(int connId) {
+        for (Iterator<Entry> it = mEntries.iterator(); it.hasNext();) {
+            Entry entry = it.next();
+            if (entry.connId == connId) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     void clear() {
         mEntries.clear();
     }