Commit c1fb3625 by Mohan Embar Committed by 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().

From-SVN: r74537
parent 834b1209
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> 2003-12-08 Fernando Nasser <fnasser@redhat.com>
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler): * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c (awt_event_handler):
......
...@@ -301,8 +301,6 @@ public final class SocketChannelImpl extends SocketChannel ...@@ -301,8 +301,6 @@ public final class SocketChannelImpl extends SocketChannel
data = src.array(); data = src.array();
} }
System.out.println ("INTERNAL: writing to socket outputstream");
OutputStream output = socket.getOutputStream(); OutputStream output = socket.getOutputStream();
output.write (data, offset, len); output.write (data, offset, len);
......
...@@ -15,7 +15,9 @@ details. */ ...@@ -15,7 +15,9 @@ details. */
#include <string.h> #include <string.h>
#include <gnu/java/nio/SelectorImpl.h> #include <gnu/java/nio/SelectorImpl.h>
#include <java/io/InterruptedIOException.h>
#include <java/io/IOException.h> #include <java/io/IOException.h>
#include <java/lang/Thread.h>
static void static void
helper_put_filedescriptors (jintArray fdArray, fd_set& fds, int& max_fd) 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) ...@@ -24,10 +26,14 @@ helper_put_filedescriptors (jintArray fdArray, fd_set& fds, int& max_fd)
for (int index = 0; index < JvGetArrayLength (fdArray); index++) for (int index = 0; index < JvGetArrayLength (fdArray); index++)
{ {
FD_SET (tmpFDArray [index], &fds); int fd = tmpFDArray [index];
if (fd > 0)
if (tmpFDArray [index] > max_fd) {
max_fd = tmpFDArray [index]; 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) ...@@ -37,8 +43,20 @@ helper_get_filedescriptors (jintArray& fdArray, fd_set fds)
jint* tmpFDArray = elements (fdArray); jint* tmpFDArray = elements (fdArray);
for (int index = 0; index < JvGetArrayLength (fdArray); index++) 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 jint
...@@ -53,15 +71,15 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write, ...@@ -53,15 +71,15 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write,
struct timeval real_time_data; struct timeval real_time_data;
struct timeval *time_data = NULL; struct timeval *time_data = NULL;
real_time_data.tv_sec = 0; // If a legal timeout value isn't given, use NULL.
real_time_data.tv_usec = timeout;
// If not legal timeout value is given, use NULL.
// This means an infinite timeout. The specification // This means an infinite timeout. The specification
// also says that a zero timeout should be treated // 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) if (timeout > 0)
{ {
real_time_data.tv_sec = timeout / 1000;
real_time_data.tv_usec = (timeout % 1000) * 1000;
time_data = &real_time_data; time_data = &real_time_data;
} }
...@@ -76,7 +94,23 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write, ...@@ -76,7 +94,23 @@ gnu::java::nio::SelectorImpl::implSelect (jintArray read, jintArray write,
helper_put_filedescriptors (except, except_fds, max_fd); helper_put_filedescriptors (except, except_fds, max_fd);
// Actually do the select // 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) if (result < 0)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment