diff --git a/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java b/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java index cb55932fd7e..a07a927e635 100644 --- a/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java +++ b/src/java.base/linux/classes/sun/nio/ch/EPollSelectorImpl.java @@ -26,7 +26,6 @@ package sun.nio.ch; import java.io.IOException; -import java.nio.channels.ClosedSelectorException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; @@ -92,11 +91,6 @@ class EPollSelectorImpl extends SelectorImpl { EPoll.ctl(epfd, EPOLL_CTL_ADD, eventfd.efd(), EPOLLIN); } - private void ensureOpen() { - if (!isOpen()) - throw new ClosedSelectorException(); - } - @Override protected int doSelect(Consumer action, long timeout) throws IOException @@ -243,7 +237,6 @@ protected void implDereg(SelectionKeyImpl ski) throws IOException { @Override public void setEventOps(SelectionKeyImpl ski) { - ensureOpen(); synchronized (updateLock) { updateKeys.addLast(ski); } diff --git a/src/java.base/macosx/classes/sun/nio/ch/KQueueSelectorImpl.java b/src/java.base/macosx/classes/sun/nio/ch/KQueueSelectorImpl.java index 6c84984f515..6abc9e31879 100644 --- a/src/java.base/macosx/classes/sun/nio/ch/KQueueSelectorImpl.java +++ b/src/java.base/macosx/classes/sun/nio/ch/KQueueSelectorImpl.java @@ -26,7 +26,6 @@ package sun.nio.ch; import java.io.IOException; -import java.nio.channels.ClosedSelectorException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; @@ -97,11 +96,6 @@ class KQueueSelectorImpl extends SelectorImpl { KQueue.register(kqfd, fd0, EVFILT_READ, EV_ADD); } - private void ensureOpen() { - if (!isOpen()) - throw new ClosedSelectorException(); - } - @Override protected int doSelect(Consumer action, long timeout) throws IOException @@ -285,7 +279,6 @@ protected void implDereg(SelectionKeyImpl ski) throws IOException { @Override public void setEventOps(SelectionKeyImpl ski) { - ensureOpen(); synchronized (updateLock) { updateKeys.addLast(ski); } diff --git a/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectableChannel.java b/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectableChannel.java index 558158cc852..27786d4b874 100644 --- a/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectableChannel.java +++ b/src/java.base/share/classes/java/nio/channels/spi/AbstractSelectableChannel.java @@ -137,6 +137,8 @@ private SelectionKey findKey(Selector sel) { void removeKey(SelectionKey k) { // package-private synchronized (keyLock) { + if (keys == null) + return; for (int i = 0; i < keys.length; i++) if (keys[i] == k) { keys[i] = null; @@ -233,7 +235,7 @@ public final SelectionKey register(Selector sel, int ops, Object att) k.interestOps(ops); } else { // New registration - k = ((AbstractSelector)sel).register(this, ops, att); + k = ((AbstractSelector) sel).register(this, ops, att); addKey(k); } return k; diff --git a/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java b/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java index bb0d603790f..88f95939d2f 100644 --- a/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java +++ b/src/java.base/share/classes/sun/nio/ch/SelectorImpl.java @@ -184,19 +184,16 @@ public final void implCloseSelector() throws IOException { wakeup(); synchronized (this) { implClose(); - synchronized (publicSelectedKeys) { - // Deregister channels - Iterator i = keys.iterator(); - while (i.hasNext()) { - SelectionKeyImpl ski = (SelectionKeyImpl)i.next(); - deregister(ski); - SelectableChannel selch = ski.channel(); - if (!selch.isOpen() && !selch.isRegistered()) - ((SelChImpl)selch).kill(); - selectedKeys.remove(ski); - i.remove(); - } - assert selectedKeys.isEmpty(); + + // Deregister channels + Iterator i = keys.iterator(); + while (i.hasNext()) { + SelectionKeyImpl ski = (SelectionKeyImpl) i.next(); + deregister(ski); + SelectableChannel selch = ski.channel(); + if (!selch.isOpen() && !selch.isRegistered()) + ((SelChImpl) selch).kill(); + i.remove(); } } } @@ -221,13 +218,13 @@ protected final SelectionKey register(AbstractSelectableChannel ch, keys.add(k); try { k.interestOps(ops); - } catch (ClosedSelectorException e) { - assert ch.keyFor(this) == null; + } catch (CancelledKeyException e) { + // key observed and cancelled + } + if (!isOpen()) { keys.remove(k); k.cancel(); - throw e; - } catch (CancelledKeyException e) { - // key observed and cancelled. Okay to return a cancelled key. + throw new ClosedSelectorException(); } return k; } @@ -277,7 +274,7 @@ protected final void processDeregisterQueue() throws IOException { SelectableChannel ch = ski.channel(); if (!ch.isOpen() && !ch.isRegistered()) - ((SelChImpl)ch).kill(); + ((SelChImpl) ch).kill(); } } } diff --git a/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java b/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java index a3bff8d1e65..d29eacb81c1 100644 --- a/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java +++ b/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java @@ -231,7 +231,6 @@ protected void implDereg(SelectionKeyImpl ski) throws IOException { @Override public void setEventOps(SelectionKeyImpl ski) { - ensureOpen(); synchronized (updateLock) { updateKeys.addLast(ski); } diff --git a/src/java.base/windows/classes/sun/nio/ch/WEPollSelectorImpl.java b/src/java.base/windows/classes/sun/nio/ch/WEPollSelectorImpl.java index bbcfab9bbf1..f2bff88675f 100644 --- a/src/java.base/windows/classes/sun/nio/ch/WEPollSelectorImpl.java +++ b/src/java.base/windows/classes/sun/nio/ch/WEPollSelectorImpl.java @@ -28,7 +28,6 @@ import java.io.FileDescriptor; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.channels.ClosedSelectorException; import java.nio.channels.Pipe; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -89,11 +88,6 @@ class WEPollSelectorImpl extends SelectorImpl { WEPoll.ctl(eph, EPOLL_CTL_ADD, fd0Val, WEPoll.EPOLLIN); } - private void ensureOpen() { - if (!isOpen()) - throw new ClosedSelectorException(); - } - @Override protected int doSelect(Consumer action, long timeout) throws IOException @@ -228,7 +222,6 @@ protected void implDereg(SelectionKeyImpl ski) throws IOException { @Override public void setEventOps(SelectionKeyImpl ski) { - ensureOpen(); synchronized (updateLock) { updateKeys.addLast(ski); } diff --git a/src/java.base/windows/classes/sun/nio/ch/WindowsSelectorImpl.java b/src/java.base/windows/classes/sun/nio/ch/WindowsSelectorImpl.java index 977a1653fdd..acdb2df326b 100644 --- a/src/java.base/windows/classes/sun/nio/ch/WindowsSelectorImpl.java +++ b/src/java.base/windows/classes/sun/nio/ch/WindowsSelectorImpl.java @@ -606,7 +606,6 @@ protected void implDereg(SelectionKeyImpl ski) { @Override public void setEventOps(SelectionKeyImpl ski) { - ensureOpen(); synchronized (updateLock) { updateKeys.addLast(ski); }