summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasey Marshall <csm@gnu.org>2006-09-23 06:44:13 +0000
committerCasey Marshall <csm@gnu.org>2006-09-23 06:44:13 +0000
commit494068a00f8773b14e42c0e305519b3cd942604f (patch)
treea1107c862c03534cdada312cd675ec1d4a8183ac
parentc3b84d141ae83f98b106850b7f6c9acb10afab83 (diff)
downloadclasspath-494068a00f8773b14e42c0e305519b3cd942604f.tar.gz
2006-09-22 Casey Marshall <csm@gnu.org>
* gnu/java/nio/EpollSelectorImpl.java (doSelect): remove keys after we delete them. (selectedKeys): return an empty set if nothing's been selected. * native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c (Java_gnu_java_nio_EpollSelectorImpl_epoll_1delete): don't throw an exception on EBADF. (Java_gnu_java_nio_EpollSelectorImpl_epoll_1wait): don't throw exception on EINTR, just return 0.
-rw-r--r--ChangeLog11
-rw-r--r--gnu/java/nio/EpollSelectorImpl.java3
-rw-r--r--native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c23
3 files changed, 29 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index eee1e0778..2b939e272 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
2006-09-22 Casey Marshall <csm@gnu.org>
+ * gnu/java/nio/EpollSelectorImpl.java (doSelect): remove keys
+ after we delete them.
+ (selectedKeys): return an empty set if nothing's been selected.
+ * native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c
+ (Java_gnu_java_nio_EpollSelectorImpl_epoll_1delete): don't
+ throw an exception on EBADF.
+ (Java_gnu_java_nio_EpollSelectorImpl_epoll_1wait): don't
+ throw exception on EINTR, just return 0.
+
+2006-09-22 Casey Marshall <csm@gnu.org>
+
* native/jni/java-io/java_io_VMFile.c (Java_java_io_VMFile_list):
remove `const' from `filename.'
* native/jni/native-lib/cpio.c (cpio_readDir): remove `const' from
diff --git a/gnu/java/nio/EpollSelectorImpl.java b/gnu/java/nio/EpollSelectorImpl.java
index ad01c734b..3bc91be93 100644
--- a/gnu/java/nio/EpollSelectorImpl.java
+++ b/gnu/java/nio/EpollSelectorImpl.java
@@ -139,6 +139,7 @@ public class EpollSelectorImpl extends AbstractSelector
epoll_delete(epoll_fd, key.fd);
key.valid = false;
keys.remove(new Integer(key.fd));
+ it.remove();
}
// Don't bother if we have nothing to select.
@@ -177,6 +178,8 @@ public class EpollSelectorImpl extends AbstractSelector
*/
public Set selectedKeys()
{
+ if (selectedKeys == null)
+ return Collections.EMPTY_SET;
return selectedKeys;
}
diff --git a/native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c b/native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c
index 654eb15ac..d794e6d9f 100644
--- a/native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c
+++ b/native/jni/java-nio/gnu_java_nio_EpollSelectorImpl.c
@@ -150,8 +150,8 @@ Java_gnu_java_nio_EpollSelectorImpl_epoll_1add (JNIEnv *env,
event.data.fd = fd;
#ifdef TRACE_EPOLL
- fprintf (stderr, "%s: adding struct epoll_event { events: %o; data.fd: %d }\n",
- __FUNCTION__, event.events, event.data.fd);
+ fprintf (stderr, "%s: adding struct epoll_event { events: %o; data.fd: %d } to %d\n",
+ __FUNCTION__, event.events, event.data.fd, efd);
#endif /* TRACE_EPOLL */
if (epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event) == -1)
@@ -197,8 +197,8 @@ Java_gnu_java_nio_EpollSelectorImpl_epoll_1modify (JNIEnv *env,
event.data.fd = fd;
#ifdef TRACE_EPOLL
- fprintf (stderr, "%s: modding struct epoll_event { events: %o; data.fd: %d }\n",
- __FUNCTION__, event.events, event.data.fd);
+ fprintf (stderr, "%s: modding struct epoll_event { events: %o; data.fd: %d } on %d\n",
+ __FUNCTION__, event.events, event.data.fd, efd);
#endif /* TRACE_EPOLL */
if (epoll_ctl (efd, EPOLL_CTL_MOD, fd, &event) == -1)
@@ -235,7 +235,7 @@ Java_gnu_java_nio_EpollSelectorImpl_epoll_1delete (JNIEnv *env,
event.data.fd = fd;
#ifdef TRACE_EPOLL
- fprintf (stderr, "%s: delete events on fd %d\n", __FUNCTION__, fd);
+ fprintf (stderr, "%s: delete events on fd %d for %d\n", __FUNCTION__, fd, efd);
#endif /* TRACE_EPOLL */
/* Older kernel versions require a non-null `event' parameter,
@@ -246,7 +246,11 @@ Java_gnu_java_nio_EpollSelectorImpl_epoll_1delete (JNIEnv *env,
if (ENOSYS == errno)
JCL_ThrowException (env, "java/lang/InternalError",
strerror (errno));
- else if (ENOENT == errno)
+ /* XXX the docs here seem a little strange. If `fd' is closed,
+ epoll_ctl returns EBADF; but the docs say that this happens
+ only when efd is invalid. Go figure.
+ */
+ else if (ENOENT == errno || EBADF == errno)
return; /* fd is closed; it's already removed. */
else
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
@@ -282,16 +286,19 @@ Java_gnu_java_nio_EpollSelectorImpl_epoll_1wait (JNIEnv *env,
}
#ifdef TRACE_EPOLL
- fprintf (stderr, "%s: events: %p; num_events: %d; timeout: %d\n",
- __FUNCTION__, p, num_events, timeout);
+ fprintf (stderr, "%s: events: %p; num_events: %d; timeout: %d; efd: %d\n",
+ __FUNCTION__, p, num_events, timeout, efd);
#endif /* TRACE_EPOLL */
ret = epoll_wait (efd, events, num_events, timeout);
+
if (ret == -1)
{
if (ENOSYS == errno)
JCL_ThrowException (env, "java/lang/InternalError",
strerror (errno));
+ else if (EINTR == errno)
+ ret = 0;
else
JCL_ThrowException (env, IO_EXCEPTION, strerror (errno));
}