diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index ac04ce0352..3907b2db68 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -612,7 +612,6 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha @Override public void read() { assert eventLoop().inEventLoop(); - // FIXME: Wrap with a loop long readAmount = 0; try { boolean closed = false; diff --git a/transport/src/main/java/io/netty/channel/socket/nio/SelectorEventLoop.java b/transport/src/main/java/io/netty/channel/socket/nio/SelectorEventLoop.java index 714b637aa0..e897fa7feb 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/SelectorEventLoop.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/SelectorEventLoop.java @@ -27,6 +27,8 @@ import java.nio.channels.CancelledKeyException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.Set; import java.util.concurrent.Executors; @@ -132,7 +134,7 @@ public class SelectorEventLoop extends SingleThreadEventLoop { cancelledKeys = 0; processTaskQueue(); - processSelectedKeys(selector.selectedKeys()); + processSelectedKeys(); // Handle connection timeout every 10 milliseconds approximately. long currentTimeNanos = System.nanoTime(); @@ -142,7 +144,7 @@ public class SelectorEventLoop extends SingleThreadEventLoop { } if (isShutdown()) { - // FIXME: Close all channels immediately and break the loop. + closeAll(); break; } } catch (Throwable t) { @@ -182,8 +184,8 @@ public class SelectorEventLoop extends SingleThreadEventLoop { } } - private void processSelectedKeys(Set selectedKeys) throws IOException { - for (Iterator i = selectedKeys.iterator(); i.hasNext();) { + private void processSelectedKeys() throws IOException { + for (Iterator i = selector.selectedKeys().iterator(); i.hasNext();) { SelectionKey k = i.next(); Channel ch = (Channel) k.attachment(); boolean removeKey = true; @@ -267,6 +269,18 @@ public class SelectorEventLoop extends SingleThreadEventLoop { return false; } + private void closeAll() { + Set keys = selector.keys(); + Collection channels = new ArrayList(keys.size()); + for (SelectionKey k: keys) { + channels.add((Channel) k.attachment()); + } + + for (Channel ch: channels) { + ch.unsafe().close(ch.unsafe().voidFuture()); + } + } + @Override protected void wakeup(boolean inEventLoop) { if (wakenUp.compareAndSet(false, true)) {