Mercurial Hosting > luan
diff src/org/eclipse/jetty/io/nio/SaneSelector.java @ 950:a778413aefc0
add SaneSelector
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 12 Oct 2016 14:37:56 -0600 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/eclipse/jetty/io/nio/SaneSelector.java Wed Oct 12 14:37:56 2016 -0600 @@ -0,0 +1,72 @@ +/* +Thread synchronization in java.nio.channels.Selector is completely fucked up, unsurprisingly since NIO was developed in this demented century. This class works around the modern insanity. +*/ + +package org.eclipse.jetty.io.nio; + +import java.io.IOException; +import java.nio.channels.Selector; +import java.nio.channels.SelectionKey; +import java.nio.channels.SelectableChannel; +import java.nio.channels.ClosedChannelException; +import java.util.Set; + + +public final class SaneSelector { + private final Selector selector; + private boolean inSelect = false; + private boolean inUpdate = false; + + public SaneSelector() throws IOException { + selector = Selector.open(); + } + + public void close() throws IOException { + selector.close(); + } + + public boolean isOpen() { + return selector.isOpen(); + } + + public int select() throws IOException { + synchronized(this) { + inSelect = true; + } + try { + while(true) { + int n = selector.select(); + synchronized(this) { + boolean wasInUpdate = inUpdate; + inUpdate = false; + if( n > 0 || !wasInUpdate ) + return n; + } + } + } finally { + synchronized(this) { + inSelect = false; + } + } + } + + public Set<SelectionKey> selectedKeys() { + return selector.selectedKeys(); + } + + public Set<SelectionKey> keys() { + return selector.keys(); + } + + public synchronized SelectionKey register(SelectableChannel channel,int ops,Object att) throws ClosedChannelException { + update(); + return channel.register(selector,ops,att); + } + + public synchronized void update() { + if( inSelect ) { + inUpdate = true; + selector.wakeup(); + } + } +} \ No newline at end of file