From d2427cac7ad30228512e4ef5b96546441d8d5373 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Sun, 1 Feb 2009 14:50:47 +0000 Subject: [PATCH] First fix for: NETTY-114 Selectors of the NIO transport are sometimes not waken up * Made sure Selector.wakeup() is called, but it can be called more than once if unlucky. Excessive wakeups are still suppressed though. --- .../channel/socket/nio/NioClientSocketPipelineSink.java | 7 +++++++ .../java/org/jboss/netty/channel/socket/nio/NioWorker.java | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java index 19154e11a1..ba7017db72 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java @@ -234,6 +234,13 @@ class NioClientSocketPipelineSink extends AbstractChannelSink { try { int selectedKeyCount = selector.select(500); + // Wake up immediately in the next turn if someone might + // have waken up the selector between 'wakenUp.set(false)' + // and 'selector.select(...)'. + if (wakenUp.get()) { + selector.wakeup(); + } + processRegisterTaskQueue(); if (selectedKeyCount > 0) { diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java index 55e4ed04cf..d758f1bfd2 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java @@ -155,6 +155,13 @@ class NioWorker implements Runnable { try { int selectedKeyCount = selector.select(500); + // Wake up immediately in the next turn if someone might + // have waken up the selector between 'wakenUp.set(false)' + // and 'selector.select(...)'. + if (wakenUp.get()) { + selector.wakeup(); + } + processRegisterTaskQueue(); processWriteTaskQueue();