+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):
#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)
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];
+ }
}
}
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
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;
}
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)
{