Skip to content

Commit

Permalink
Do not use SelectorPool to create selectors that won't pool.
Browse files Browse the repository at this point in the history
Fixes #3588.
  • Loading branch information
headius committed Jan 20, 2016
1 parent 811a8d1 commit a9a1184
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions 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;
Expand Down Expand Up @@ -321,20 +322,26 @@ 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);
if (enxioSelectors.isEmpty()) enxioSelectors = new ArrayList<ENXIOSelector>();
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;
Expand Down

0 comments on commit a9a1184

Please sign in to comment.