* gnu/java/nio/SocketChannelImpl.java
authorMohan Embar <gnustuff@thisiscool.com>
Thu, 11 Dec 2003 15:35:13 +0000 (15:35 +0000)
committerMohan Embar <membar@gcc.gnu.org>
Thu, 11 Dec 2003 15:35:13 +0000 (15:35 +0000)
(write): Removed diagnostic trace.
* gnu/java/nio/natSelectorImplPosix.cc: Added
includes for java.lang.Thread and java.io.InterruptedIOException.
(helper_put_filedescriptors): Don't put invalid file descriptors
in select set.
(helper_get_filedescriptors): Clear invalid file descriptors
from select set.
(helper_reset): New method for clearing our file descriptor
array.
(implSelect): Correctly calculate timeout if specified and
legal.
Intercept and deal with any java.io.InterruptedIOException
thrown by _Jv_select().

From-SVN: r74537

libjava/ChangeLog
libjava/gnu/java/nio/SocketChannelImpl.java
libjava/gnu/java/nio/natSelectorImplPosix.cc

index 09b1e9862c4b25d13aaed2da1b3f64f4de097ef5..5a7f73ba5f0a45f38d24ac53f9f9ba7d8fe9629e 100644 (file)
@@ -1,3 +1,20 @@
+2003-12-11  Mohan Embar  <gnustuff@thisiscool.com>
+
+       * gnu/java/nio/SocketChannelImpl.java
+       (write): Removed diagnostic trace.
+       * gnu/java/nio/natSelectorImplPosix.cc: Added
+       includes for java.lang.Thread and java.io.InterruptedIOException.
+       (helper_put_filedescriptors): Don't put invalid file descriptors
+       in select set.
+       (helper_get_filedescriptors): Clear invalid file descriptors
+       from select set.
+       (helper_reset): New method for clearing our file descriptor
+       array.
+       (implSelect): Correctly calculate timeout if specified and
+       legal.
+       Intercept and deal with any java.io.InterruptedIOException
+       thrown by _Jv_select().
+
 2003-12-08  Fernando Nasser  <fnasser@redhat.com>
 
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler):
index 46c0d8c0fae48d5270d47b2b0415713f050390b6..ced8ef2476a10aacf3e997bf6438b199d3610f76 100644 (file)
@@ -301,8 +301,6 @@ public final class SocketChannelImpl extends SocketChannel
         data = src.array();
       }
 
-    System.out.println ("INTERNAL: writing to socket outputstream");
-    
     OutputStream output = socket.getOutputStream();
     output.write (data, offset, len);
 
index 81de3ed9475d5673848fb599816e5a5b78b72e67..ac16dac7b9a715f2ec7dbd47b6b64de184c7e4ab 100644 (file)
@@ -15,7 +15,9 @@ details.  */
 #include <string.h>
 
 #include <gnu/java/nio/SelectorImpl.h>
+#include <java/io/InterruptedIOException.h>
 #include <java/io/IOException.h>
+#include <java/lang/Thread.h>
 
 static void
 helper_put_filedescriptors (jintArray fdArray, fd_set& fds, int& max_fd)
@@ -24,10 +26,14 @@ helper_put_filedescriptors (jintArray fdArray, fd_set& fds, int& max_fd)
 
   for (int index = 0; index < JvGetArrayLength (fdArray); index++)
     {
-      FD_SET (tmpFDArray [index], &fds);
-
-      if (tmpFDArray [index] > max_fd)
-        max_fd = tmpFDArray [index];
+      int fd = tmpFDArray [index];
+      if (fd > 0)
+        {
+          FD_SET (tmpFDArray [index], &fds);
+
+          if (tmpFDArray [index] > max_fd)
+            max_fd = tmpFDArray [index];
+        }
     }
 }
 
@@ -37,8 +43,20 @@ helper_get_filedescriptors (jintArray& fdArray, fd_set fds)
   jint* tmpFDArray = elements (fdArray);
   
   for (int index = 0; index < JvGetArrayLength (fdArray); index++)
-    if (!FD_ISSET (tmpFDArray [index], &fds))
-      tmpFDArray [index] = 0;
+    {
+      int fd = tmpFDArray [index];
+      if (fd < 0 || !FD_ISSET (fd, &fds))
+        tmpFDArray [index] = 0;
+    }
+}
+
+static void
+helper_reset (jintArray& fdArray)
+{
+  jint* tmpFDArray = elements (fdArray);
+  
+  for (int index = 0; index < JvGetArrayLength (fdArray); index++)
+    tmpFDArray [index] = 0;
 }
 
 jint
@@ -53,15 +71,15 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write,
   struct timeval real_time_data;
   struct timeval *time_data = NULL;
 
-  real_time_data.tv_sec = 0;
-  real_time_data.tv_usec = timeout;
-
-  // If not legal timeout value is given, use NULL.
+  // If a legal timeout value isn't given, use NULL.
   // This means an infinite timeout. The specification
   // also says that a zero timeout should be treated
-  // as infinite.
+  // as infinite. Otherwise (if the timeout value is legal),
+  // fill our timeval struct and use it for the select.
   if (timeout > 0)
     {
+      real_time_data.tv_sec = timeout / 1000;
+      real_time_data.tv_usec = (timeout % 1000) * 1000;
       time_data = &real_time_data;
     }
 
@@ -76,7 +94,23 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write,
   helper_put_filedescriptors (except, except_fds, max_fd);
 
   // Actually do the select
-  result = _Jv_select (max_fd + 1, &read_fds, &write_fds, &except_fds, time_data);
+  try
+    {
+      result = _Jv_select (max_fd + 1, &read_fds, &write_fds,
+                           &except_fds, time_data);
+    }
+  catch (::java::io::InterruptedIOException *e)
+    {
+      // The behavior of JRE 1.4.1 is that no exception is thrown
+      // when the thread is interrupted, but the thread's interrupt
+      // status is set. Clear all of our select sets and return 0,
+      // indicating that nothing was selected.
+      ::java::lang::Thread::currentThread ()->interrupt ();
+       helper_reset (read);
+       helper_reset (write);
+       helper_reset (except);
+       return 0;
+    }
 
   if (result < 0)
     {