Paul Jenner helpfully pointed out some problems when running Azureus
with the epoll selector, and the modified DatagramSocket implementation.

2006-09-21  Casey Marshall  <[EMAIL PROTECTED]>

        * gnu/java/net/PlainDatagramSocketImpl.java (send): ignore
        `InterruptedIOException;' try again if it gets thrown.
        (receive): likewise, but re-throw `SocketTimeoutException.'
        * gnu/java/nio/EpollSelectorImpl.java (doSelect): just return 0
        if we have nothing to select.

Committed.
### Eclipse Workspace Patch 1.0
#P classpath
Index: gnu/java/nio/EpollSelectorImpl.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/nio/EpollSelectorImpl.java,v
retrieving revision 1.1
diff -u -r1.1 EpollSelectorImpl.java
--- gnu/java/nio/EpollSelectorImpl.java 20 Sep 2006 21:39:41 -0000      1.1
+++ gnu/java/nio/EpollSelectorImpl.java 21 Sep 2006 23:16:22 -0000
@@ -140,6 +140,10 @@
             key.valid = false;
             keys.remove(new Integer(key.fd));
           }
+        
+        // Don't bother if we have nothing to select.
+        if (keys.isEmpty())
+          return 0;
 
         ByteBuffer selected =
           ByteBuffer.allocateDirect(keys.size() * sizeof_struct_epoll_event);
Index: gnu/java/net/PlainDatagramSocketImpl.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/net/PlainDatagramSocketImpl.java,v
retrieving revision 1.11
diff -u -r1.11 PlainDatagramSocketImpl.java
--- gnu/java/net/PlainDatagramSocketImpl.java   17 Sep 2006 07:31:41 -0000      
1.11
+++ gnu/java/net/PlainDatagramSocketImpl.java   21 Sep 2006 23:16:22 -0000
@@ -41,6 +41,7 @@
 import gnu.java.nio.VMChannel;
 
 import java.io.IOException;
+import java.io.InterruptedIOException;
 import java.lang.reflect.Field;
 import java.net.DatagramPacket;
 import java.net.DatagramSocketImpl;
@@ -49,6 +50,7 @@
 import java.net.NetworkInterface;
 import java.net.SocketAddress;
 import java.net.SocketException;
+import java.net.SocketTimeoutException;
 import java.nio.ByteBuffer;
 
 /**
@@ -259,7 +261,17 @@
           throw new NullPointerException();
         if (port <= 0)
           throw new SocketException("invalid port " + port);
-        channel.send(buf, new InetSocketAddress(remote, port));
+        while (true)
+          {
+            try
+              {
+                channel.send(buf, new InetSocketAddress(remote, port));
+              }
+            catch (InterruptedIOException ioe)
+              {
+                // Ignore; interrupted system call.
+              }
+          }
       }
   }
 
@@ -278,7 +290,23 @@
         ByteBuffer buf = ByteBuffer.wrap(packet.getData(),
                                          packet.getOffset(),
                                          packet.getLength());
-        SocketAddress addr = channel.receive(buf);
+        SocketAddress addr = null;
+        while (true)
+          {
+            try
+              {
+                addr = channel.receive(buf);
+                break;
+              }
+            catch (SocketTimeoutException ste)
+              {
+                throw ste;
+              }
+            catch (InterruptedIOException iioe)
+              {
+                // Ignore. Loop.
+              }
+          }
         if (addr != null)
           packet.setSocketAddress(addr);
         packet.setLength(buf.position() - packet.getOffset());

Reply via email to