From 79639b10b7d39bd6408074efb839c7a75733a49a Mon Sep 17 00:00:00 2001 From: Wayne Meissner Date: Sat, 17 Nov 2012 18:36:20 +1100 Subject: [PATCH] When cancelling a SelectionKey, remove it from the selected key set. Fixes jruby/jruby#398, and possibly jruby/jruby#334. --- src/main/java/jnr/enxio/channels/KQSelector.java | 3 +++ src/main/java/jnr/enxio/channels/PollSelector.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/main/java/jnr/enxio/channels/KQSelector.java b/src/main/java/jnr/enxio/channels/KQSelector.java index a28ae48..ba4e6bd 100644 --- a/src/main/java/jnr/enxio/channels/KQSelector.java +++ b/src/main/java/jnr/enxio/channels/KQSelector.java @@ -162,6 +162,9 @@ private int poll(long timeout) { KQSelectionKey kqs = (KQSelectionKey) k; Descriptor d = descriptors.get(kqs.getFD()); deregister(kqs); + synchronized (selected) { + selected.remove(kqs); + } d.keys.remove(kqs); if (d.keys.isEmpty()) { io.put(changebuf, nchanged++, kqs.getFD(), EVFILT_READ, EV_DELETE); diff --git a/src/main/java/jnr/enxio/channels/PollSelector.java b/src/main/java/jnr/enxio/channels/PollSelector.java index 43a5e6c..552b326 100644 --- a/src/main/java/jnr/enxio/channels/PollSelector.java +++ b/src/main/java/jnr/enxio/channels/PollSelector.java @@ -179,6 +179,9 @@ private void remove(PollSelectionKey k) { } keyArray[nfds - 1] = null; --nfds; + synchronized (selected) { + selected.remove(k); + } keys.remove(k); } deregister(k);