From a9a1184689be8aa73272e9a4dd5ed89ae44345d2 Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Wed, 20 Jan 2016 03:19:09 -0600 Subject: [PATCH] Do not use SelectorPool to create selectors that won't pool. Fixes #3588. --- .../java/org/jruby/util/io/SelectExecutor.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/jruby/util/io/SelectExecutor.java b/core/src/main/java/org/jruby/util/io/SelectExecutor.java index 6138a1425ca..4bd5cdda95b 100644 --- a/core/src/main/java/org/jruby/util/io/SelectExecutor.java +++ b/core/src/main/java/org/jruby/util/io/SelectExecutor.java @@ -1,5 +1,6 @@ package org.jruby.util.io; +import jnr.enxio.channels.NativeSelectorProvider; import org.jruby.Ruby; import org.jruby.RubyArray; import org.jruby.RubyIO; @@ -321,10 +322,10 @@ private Selector getSelector(ThreadContext context, SelectableChannel channel) t } if (selector == null) { - selector = context.runtime.getSelectorPool().get(channel.provider()); - selectors.add(selector); + if (channel.provider() instanceof NativeSelectorProvider) { + // We don't pool these, so create it directly + selector = channel.provider().openSelector(); - if (!selector.provider().equals(SelectorProvider.provider())) { // need to create pipe between alt impl selector and native NIO selector Pipe pipe = Pipe.open(); ENXIOSelector enxioSelector = new ENXIOSelector(selector, pipe); @@ -332,9 +333,15 @@ private Selector getSelector(ThreadContext context, SelectableChannel channel) t enxioSelectors.add(enxioSelector); pipe.source().configureBlocking(false); pipe.source().register(getSelector(context, pipe.source()), SelectionKey.OP_READ, enxioSelector); - } else if (mainSelector == null) { - mainSelector = selector; + } else { + selector = context.runtime.getSelectorPool().get(); + + if (mainSelector == null) { + mainSelector = selector; + } } + + selectors.add(selector); } return selector;