From 7441122e2360aa17177f077f92d7088715f306f0 Mon Sep 17 00:00:00 2001 From: Christopher Lane Date: Fri, 25 Apr 2014 18:39:07 -0700 Subject: [PATCH] Fix incorrect "listener no longer active" errors Was incorrectly using .indexOfValue to search for Integer objects in the client map. Change-Id: I54e2e1725e0fff0a7d35a22376714cc8266a9eee --- .../java/com/android/server/NsdService.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/NsdService.java b/services/core/java/com/android/server/NsdService.java index fa803e2d3a..fe97c71f5e 100644 --- a/services/core/java/com/android/server/NsdService.java +++ b/services/core/java/com/android/server/NsdService.java @@ -421,11 +421,8 @@ public class NsdService extends INsdManager.Stub { } /* This goes in response as msg.arg2 */ - int clientId = -1; - int keyId = clientInfo.mClientIds.indexOfValue(id); - if (keyId != -1) { - clientId = clientInfo.mClientIds.keyAt(keyId); - } else { + int clientId = clientInfo.getClientId(id); + if (clientId < 0) { // This can happen because of race conditions. For example, // SERVICE_FOUND may race with STOP_SERVICE_DISCOVERY, // and we may get in this situation. @@ -904,5 +901,18 @@ public class NsdService extends INsdManager.Stub { mClientRequests.clear(); } + // mClientIds is a sparse array of listener id -> mDnsClient id. For a given mDnsClient id, + // return the corresponding listener id. mDnsClient id is also called a global id. + private int getClientId(final int globalId) { + // This doesn't use mClientIds.indexOfValue because indexOfValue uses == (not .equals) + // while also coercing the int primitives to Integer objects. + for (int i = 0, nSize = mClientIds.size(); i < nSize; i++) { + int mDnsId = mClientIds.valueAt(i); + if (globalId == mDnsId) { + return mClientIds.keyAt(i); + } + } + return -1; + } } }