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:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user