Merge "Fix legacy request removal." into lmp-mr1-dev
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 61a7073..8cc3d2c 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2324,6 +2324,9 @@
if (nri.isRequest) {
// Find all networks that are satisfying this request and remove the request
// from their request lists.
+ // TODO - it's my understanding that for a request there is only a single
+ // network satisfying it, so this loop is wasteful
+ boolean wasKept = false;
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
if (nai.networkRequests.get(nri.request.requestId) != null) {
nai.networkRequests.remove(nri.request.requestId);
@@ -2335,19 +2338,39 @@
if (unneeded(nai)) {
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
teardownUnneededNetwork(nai);
+ } else {
+ // suspect there should only be one pass through here
+ // but if any were kept do the check below
+ wasKept |= true;
}
}
}
+ NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
+ if (nai != null) {
+ mNetworkForRequestId.remove(nri.request.requestId);
+ }
// Maintain the illusion. When this request arrived, we might have pretended
// that a network connected to serve it, even though the network was already
// connected. Now that this request has gone away, we might have to pretend
// that the network disconnected. LegacyTypeTracker will generate that
// phantom disconnect for this type.
- NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
- if (nai != null) {
- mNetworkForRequestId.remove(nri.request.requestId);
- if (nri.request.legacyType != TYPE_NONE) {
+ if (nri.request.legacyType != TYPE_NONE && nai != null) {
+ boolean doRemove = true;
+ if (wasKept) {
+ // check if any of the remaining requests for this network are for the
+ // same legacy type - if so, don't remove the nai
+ for (int i = 0; i < nai.networkRequests.size(); i++) {
+ NetworkRequest otherRequest = nai.networkRequests.valueAt(i);
+ if (otherRequest.legacyType == nri.request.legacyType &&
+ isRequest(otherRequest)) {
+ if (DBG) log(" still have other legacy request - leaving");
+ doRemove = false;
+ }
+ }
+ }
+
+ if (doRemove) {
mLegacyTypeTracker.remove(nri.request.legacyType, nai);
}
}