From 494068a00f8773b14e42c0e305519b3cd942604f Mon Sep 17 00:00:00 2001 From: Casey Marshall Date: Sat, 23 Sep 2006 06:44:13 +0000 Subject: 2006-09-22 Casey Marshall * 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. --- ChangeLog | 11 +++++++++++ gnu/java/nio/EpollSelectorImpl.java | 3 +++ .../jni/java-nio/gnu_java_nio_EpollSelectorImpl.c | 23 ++++++++++++++-------- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index eee1e0778..2b939e272 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-09-22 Casey Marshall + + * 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 * native/jni/java-io/java_io_VMFile.c (Java_java_io_VMFile_list): 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)); } -- cgit v1.2.1