Destroy networks as soon as they are disconnected.

...as opposed to after the async channel finished disconnecting.

Bug: 78308259
Test: runtest frameworks-net
      also used a device with this patch over the weekend and
      tried all I could think of

Change-Id: I77ad6d97abb20815b801a794eaa9685acf2d1173
This commit is contained in:
Chalard Jean
2018-05-11 20:19:20 +09:00
parent 8ab8d5c74e
commit d9fffc3510

View File

@@ -2442,9 +2442,23 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
} }
// This is a no-op if it's called with a message designating a network that has
// already been destroyed, because its reference will not be found in the relevant
// maps.
private void handleAsyncChannelDisconnected(Message msg) { private void handleAsyncChannelDisconnected(Message msg) {
NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo); NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);
if (nai != null) { if (nai != null) {
disconnectAndDestroyNetwork(nai);
} else {
NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo);
if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name);
}
}
// Destroys a network, remove references to it from the internal state managed by
// ConnectivityService, free its interfaces and clean up.
// Must be called on the Handler thread.
private void disconnectAndDestroyNetwork(NetworkAgentInfo nai) {
if (DBG) { if (DBG) {
log(nai.name() + " got DISCONNECTED, was satisfying " + nai.numNetworkRequests()); log(nai.name() + " got DISCONNECTED, was satisfying " + nai.numNetworkRequests());
} }
@@ -2480,7 +2494,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
wakeupModifyInterface(iface, nai.networkCapabilities, false); wakeupModifyInterface(iface, nai.networkCapabilities, false);
} }
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED); nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED);
mNetworkAgentInfos.remove(msg.replyTo); mNetworkAgentInfos.remove(nai.messenger);
nai.maybeStopClat(); nai.maybeStopClat();
synchronized (mNetworkForNetId) { synchronized (mNetworkForNetId) {
// Remove the NetworkAgent, but don't mark the netId as // Remove the NetworkAgent, but don't mark the netId as
@@ -2527,10 +2541,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
synchronized (mNetworkForNetId) { synchronized (mNetworkForNetId) {
mNetIdInUse.delete(nai.network.netId); mNetIdInUse.delete(nai.network.netId);
} }
} else {
NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(msg.replyTo);
if (DBG && nfi != null) log("unregisterNetworkFactory for " + nfi.name);
}
} }
// If this method proves to be too slow then we can maintain a separate // If this method proves to be too slow then we can maintain a separate
@@ -5618,6 +5628,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
updateUids(networkAgent, networkAgent.networkCapabilities, null); updateUids(networkAgent, networkAgent.networkCapabilities, null);
} }
disconnectAndDestroyNetwork(networkAgent);
} else if ((oldInfo != null && oldInfo.getState() == NetworkInfo.State.SUSPENDED) || } else if ((oldInfo != null && oldInfo.getState() == NetworkInfo.State.SUSPENDED) ||
state == NetworkInfo.State.SUSPENDED) { state == NetworkInfo.State.SUSPENDED) {
// going into or coming out of SUSPEND: rescore and notify // going into or coming out of SUSPEND: rescore and notify