Actually close sockets when stopping the receive thread.
Contrary to the expectations of the code, IoUtils.closeQuietly()
does not unblock system calls. So mReceiveThread.halt() was not
actually stopping the receive thread.
This wasn't actually a problem, because after "stopping" the
receive thread, either the interface would go down (interrupting
the previous receive thread with ENETDOWN), or a packet would
arrive to both the old and new receive threads, stopping the
old one. But the lack of a "stopping receive thread" message at
the expected time was confusing.
While I'm at it, also add the string for CMD_TIMEOUT.
Bug: 19704592
Change-Id: I74732429118af780453028898148519b294fa9d3
diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java
index 069b591..575a300 100644
--- a/services/net/java/android/net/dhcp/DhcpClient.java
+++ b/services/net/java/android/net/dhcp/DhcpClient.java
@@ -58,7 +58,7 @@
import java.util.Arrays;
import java.util.Random;
-import libcore.io.IoUtils;
+import libcore.io.IoBridge;
import static android.system.OsConstants.*;
import static android.net.dhcp.DhcpPacket.*;
@@ -297,9 +297,15 @@
return true;
}
+ private static void closeQuietly(FileDescriptor fd) {
+ try {
+ IoBridge.closeAndSignalBlockedThreads(fd);
+ } catch (IOException ignored) {}
+ }
+
private void closeSockets() {
- IoUtils.closeQuietly(mUdpSock);
- IoUtils.closeQuietly(mPacketSock);
+ closeQuietly(mUdpSock);
+ closeQuietly(mPacketSock);
}
private boolean setIpAddress(LinkAddress address) {
@@ -326,7 +332,7 @@
@Override
public void run() {
- maybeLog("Starting receive thread");
+ maybeLog("Receive thread started");
while (!stopped) {
try {
int length = Os.read(mPacketSock, mPacket, 0, mPacket.length);
@@ -345,7 +351,7 @@
}
}
}
- maybeLog("Stopping receive thread");
+ maybeLog("Receive thread stopped");
}
}
@@ -463,6 +469,8 @@
return "CMD_KICK";
case CMD_RECEIVED_PACKET:
return "CMD_RECEIVED_PACKET";
+ case CMD_TIMEOUT:
+ return "CMD_TIMEOUT";
default:
return Integer.toString(what);
}