From c1fb3625aebaa9ccacc16eb185f04a93e4ed459f Mon Sep 17 00:00:00 2001 From: Mohan Embar Date: Thu, 11 Dec 2003 15:35:13 +0000 Subject: [PATCH] * 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(). From-SVN: r74537 --- libjava/ChangeLog | 17 ++++++ libjava/gnu/java/nio/SocketChannelImpl.java | 2 - libjava/gnu/java/nio/natSelectorImplPosix.cc | 56 ++++++++++++++++---- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 09b1e9862c4..5a7f73ba5f0 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,20 @@ +2003-12-11 Mohan Embar + + * 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 * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): diff --git a/libjava/gnu/java/nio/SocketChannelImpl.java b/libjava/gnu/java/nio/SocketChannelImpl.java index 46c0d8c0fae..ced8ef2476a 100644 --- a/libjava/gnu/java/nio/SocketChannelImpl.java +++ b/libjava/gnu/java/nio/SocketChannelImpl.java @@ -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); diff --git a/libjava/gnu/java/nio/natSelectorImplPosix.cc b/libjava/gnu/java/nio/natSelectorImplPosix.cc index 81de3ed9475..ac16dac7b9a 100644 --- a/libjava/gnu/java/nio/natSelectorImplPosix.cc +++ b/libjava/gnu/java/nio/natSelectorImplPosix.cc @@ -15,7 +15,9 @@ details. */ #include #include +#include #include +#include 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); + int fd = tmpFDArray [index]; + if (fd > 0) + { + FD_SET (tmpFDArray [index], &fds); - if (tmpFDArray [index] > max_fd) - max_fd = tmpFDArray [index]; + 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) {