[kaffe] CVS kaffe (guilhem): Fixes for selectable channel.

Kaffe CVS cvs-commits at kaffe.org
Sun Apr 3 04:28:32 PDT 2005


PatchSet 5650 
Date: 2005/04/03 11:24:04
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Fixes for selectable channel.

2005-04-03  Rei Odaira <ray at is.s.u-tokyo.ac.jp>

        * kaffe/kaffevm/systems/unix-jthreads/jthread.c
        (jthreadedSelect): Fixed timeout handling, fdset handling. maxFd,
        readsPending, writesPending updated properly.

        * libraries/clib/nio/gnu_java_nio_VMSelector.c
        (helper_select, select0): Use a negative value to avoid confusion
        between the number of filedescriptor and the error value returned
        by select.

        * libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java
        (register): Check for blocking state.

Members: 
	ChangeLog:1.3820->1.3821 
	kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.131->1.132 
	libraries/clib/nio/gnu_java_nio_VMSelector.c:1.5->1.6 
	libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java:1.11->1.12 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3820 kaffe/ChangeLog:1.3821
--- kaffe/ChangeLog:1.3820	Sun Apr  3 00:51:21 2005
+++ kaffe/ChangeLog	Sun Apr  3 11:24:04 2005
@@ -1,3 +1,17 @@
+2005-04-03  Rei Odaira <ray at is.s.u-tokyo.ac.jp>
+
+	* kaffe/kaffevm/systems/unix-jthreads/jthread.c
+	(jthreadedSelect): Fixed timeout handling, fdset handling. maxFd,
+	readsPending, writesPending updated properly.
+
+	* libraries/clib/nio/gnu_java_nio_VMSelector.c
+	(helper_select, select0): Use a negative value to avoid confusion
+	between the number of filedescriptor and the error value returned
+	by select.
+
+	* libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java
+	(register): Check for blocking state.
+
 2005-04-03  Dalibor Topic  <robilad at kaffe.org>
 
 	* kaffe/kaffevm/systems/unix-pthreads/Makefile.am 
Index: kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c
diff -u kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.131 kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.132
--- kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c:1.131	Sat Apr  2 17:44:45 2005
+++ kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c	Sun Apr  3 11:24:08 2005
@@ -3325,29 +3325,64 @@
 	tval.tv_sec = 0;
 	tval.tv_usec = 0;
 
-	time_milli = e->tv_usec / 1000 + e->tv_sec * 1000;
+	if (e != NULL)
+		time_milli = e->tv_usec / 1000 + e->tv_sec * 1000;
+	else
+		time_milli = NOTIMEOUT;
 
 	intsDisable();
 
 	for (;;) {
-		if ((*out = select(a, b, c, d, &tval)) == -1) {
+		fd_set tmp_b, tmp_c, tmp_d;
+
+		FD_COPY(b, &tmp_b);
+		FD_COPY(c, &tmp_c);
+		FD_COPY(d, &tmp_d);
+
+		if ((*out = select(a, &tmp_b, &tmp_c, &tmp_d, &tval)) == -1) {
 			rc = errno;
 			break;
 		}
-		if ((*out == 0 && second_time) || *out != 0)
+		if ((*out == 0 && second_time) || *out != 0) {
+			FD_COPY(&tmp_b, b);
+			FD_COPY(&tmp_c, c);
+			FD_COPY(&tmp_d, d);
 			break;
+		}
 
 		if (time_milli != 0) {
+			int interrupted;
+
+			BLOCKED_ON_EXTERNAL(currentJThread);
+
+			if (a - 1 > maxFd)
+				maxFd = a - 1;
+
 			for (i=0;i<a;i++) {
-				if (b && FD_ISSET(i, b))
+				if (b && FD_ISSET(i, b)) {
+					FD_SET(i, &readsPending);
 					addWaitQThread(currentJThread, &readQ[i]);
-				if (c && FD_ISSET(i, c))
+				}
+				if (c && FD_ISSET(i, c)) {
+					FD_SET(i, &writesPending);
 					addWaitQThread(currentJThread, &writeQ[i]);
+				}
 			}
 
-			if (suspendOnQThread(currentJThread, NULL, time_milli)) {
+			interrupted = suspendOnQThread(currentJThread, NULL, time_milli);
+
+			for (i=0;i<a;i++) {
+				if (b && FD_ISSET(i, b))
+					FD_CLR(i, &readsPending);
+				if (c && FD_ISSET(i, c))
+					FD_CLR(i, &writesPending);
+			}
+			if (interrupted) {
 				rc = EINTR;
 				*out = 0;
+				FD_ZERO(b);
+				FD_ZERO(c);
+				FD_ZERO(d);
 				break;
 			}
 		}
Index: kaffe/libraries/clib/nio/gnu_java_nio_VMSelector.c
diff -u kaffe/libraries/clib/nio/gnu_java_nio_VMSelector.c:1.5 kaffe/libraries/clib/nio/gnu_java_nio_VMSelector.c:1.6
--- kaffe/libraries/clib/nio/gnu_java_nio_VMSelector.c:1.5	Fri Apr  1 01:02:56 2005
+++ kaffe/libraries/clib/nio/gnu_java_nio_VMSelector.c	Sun Apr  3 11:24:08 2005
@@ -166,7 +166,7 @@
 		/* Here we know we got EINTR. */
 		if ( (*env)->CallStaticBooleanMethod(env, thread_class, thread_interrupted) )
 		{
-			return EINTR;
+			return -2;
 		}
 
 		if (timeout)
@@ -249,7 +249,7 @@
 	result = helper_select (env, thread_class, thread_interrupted, max_fd + 1, &read_fds, &write_fds,
 								&except_fds, time_data);
 
-	if( result == EINTR ) {
+	if( result == -2 ) {
 		/* 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,
Index: kaffe/libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java
diff -u kaffe/libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java:1.11 kaffe/libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java:1.12
--- kaffe/libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java:1.11	Fri Dec  3 00:44:29 2004
+++ kaffe/libraries/javalib/java/nio/channels/spi/AbstractSelectableChannel.java	Sun Apr  3 11:24:09 2005
@@ -43,6 +43,7 @@
 import java.nio.channels.SelectableChannel;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
+import java.nio.channels.IllegalBlockingModeException;
 import java.util.LinkedList;
 import java.util.ListIterator;
 
@@ -224,6 +225,9 @@
 
     synchronized (blockingLock())
       {
+	if (blocking)
+	  throw new IllegalBlockingModeException();
+
 	key = locate(selector);
 
 	if (key != null && key.isValid())




More information about the kaffe mailing list