Move blockUntilAvailableOrTimeout method to IoBridge
... so that we can reuse this method in other classes.
Test: java.nio.channels.DatagramChannelMulticastTest
Change-Id: Ibf6c1a6bef3cc1d0f76387331159f0c9a383a919
diff --git a/luni/src/main/java/libcore/io/IoBridge.java b/luni/src/main/java/libcore/io/IoBridge.java
index f5177fd..e5d1930 100644
--- a/luni/src/main/java/libcore/io/IoBridge.java
+++ b/luni/src/main/java/libcore/io/IoBridge.java
@@ -35,7 +35,6 @@
import java.net.InetSocketAddress;
import java.net.NetworkInterface;
import java.net.PortUnreachableException;
-import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketOptions;
import java.net.SocketTimeoutException;
@@ -645,6 +644,29 @@
}
}
+ /**
+ * Wait for some event on a file descriptor, blocks until the event happened or timeout period
+ * passed. See poll(2) and @link{android.system.Os.Poll}.
+ *
+ * @throws SocketException if poll(2) fails.
+ * @throws SocketTimeoutException if the event has not happened before timeout period has passed.
+ */
+ public static void poll(FileDescriptor fd, int events, int timeout)
+ throws SocketException, SocketTimeoutException {
+ StructPollfd[] pollFds = new StructPollfd[]{ new StructPollfd() };
+ pollFds[0].fd = fd;
+ pollFds[0].events = (short) events;
+
+ try {
+ int ret = android.system.Os.poll(pollFds, timeout);
+ if (ret == 0) {
+ throw new SocketTimeoutException("Poll timed out");
+ }
+ } catch (ErrnoException e) {
+ e.rethrowAsSocketException();
+ }
+ }
+
public static InetSocketAddress getLocalInetSocketAddress(FileDescriptor fd) throws SocketException {
try {
return (InetSocketAddress) Libcore.os.getsockname(fd);
diff --git a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java b/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java
index cf3af30..ae45c0d 100644
--- a/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java
+++ b/luni/src/test/java/libcore/java/nio/channels/DatagramChannelMulticastTest.java
@@ -18,12 +18,7 @@
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
-
-import android.system.ErrnoException;
-import android.system.StructPollfd;
-
import java.io.IOException;
-import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
@@ -32,6 +27,7 @@
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.net.SocketException;
+import java.net.SocketTimeoutException;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
@@ -40,6 +36,8 @@
import java.util.ArrayList;
import java.util.Enumeration;
+import libcore.io.IoBridge;
+
import static android.system.OsConstants.POLLIN;
/**
@@ -780,7 +778,7 @@
// Send a message. It should be received.
String msg1 = "Hello1";
sendMessage(sendingChannel, msg1, groupSocketAddress);
- blockUntilAvailableOrTimeout(receivingChannel.socket(), 1000);
+ IoBridge.poll(receivingChannel.socket().getFileDescriptor$(), POLLIN, 1000);
InetSocketAddress sourceAddress1 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
assertEquals(sourceAddress1, sendingAddress);
assertEquals(msg1, new String(receiveBuffer.array(), 0, receiveBuffer.position()));
@@ -791,7 +789,10 @@
// Send a message. It should be filtered.
String msg2 = "Hello2";
sendMessage(sendingChannel, msg2, groupSocketAddress);
- blockUntilAvailableOrTimeout(receivingChannel.socket(), 1000);
+ try {
+ IoBridge.poll(receivingChannel.socket().getFileDescriptor$(), POLLIN, 1000);
+ fail();
+ } catch (SocketTimeoutException expected) { }
receiveBuffer.position(0);
InetSocketAddress sourceAddress2 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
assertNull(sourceAddress2);
@@ -802,7 +803,7 @@
// Send a message. It should be received.
String msg3 = "Hello3";
sendMessage(sendingChannel, msg3, groupSocketAddress);
- blockUntilAvailableOrTimeout(receivingChannel.socket(), 1000);
+ IoBridge.poll(receivingChannel.socket().getFileDescriptor$(), POLLIN, 1000);
receiveBuffer.position(0);
InetSocketAddress sourceAddress3 = (InetSocketAddress) receivingChannel.receive(receiveBuffer);
assertEquals(sourceAddress3, sendingAddress);
@@ -1245,14 +1246,5 @@
}
throw new AssertionFailedError("Unable to find local IPv6 address for " + networkInterface);
}
-
- private static void blockUntilAvailableOrTimeout(DatagramSocket s, int timeout) {
- try {
- StructPollfd[] pollFds = new StructPollfd[]{ new StructPollfd() };
- pollFds[0].fd = s.getFileDescriptor$();
- pollFds[0].events = (short) POLLIN;
- android.system.Os.poll(pollFds, timeout);
- } catch (ErrnoException ignored) { }
- }
}