From 8777c3c02b007fb5a0e1a4a960c247a0b17d35e5 Mon Sep 17 00:00:00 2001 From: norman Date: Thu, 26 Apr 2012 14:41:47 +0200 Subject: [PATCH] OioWorker failed to fire channelConnected event for OioAcceptedSocketChannel which is fixed now. This also fix a race which can could lead to missing events. See #287 --- .../channel/socket/oio/AbstractOioWorker.java | 32 +++++++------------ .../netty/channel/socket/oio/OioWorker.java | 12 +++++++ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/jboss/netty/channel/socket/oio/AbstractOioWorker.java b/src/main/java/org/jboss/netty/channel/socket/oio/AbstractOioWorker.java index f335903a48..8b3187f6f2 100644 --- a/src/main/java/org/jboss/netty/channel/socket/oio/AbstractOioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/oio/AbstractOioWorker.java @@ -52,16 +52,8 @@ abstract class AbstractOioWorker implements Worker public void run() { thread = channel.workerThread = Thread.currentThread(); - boolean fireConnected = channel instanceof OioAcceptedSocketChannel; - + while (channel.isOpen()) { - if (fireConnected) { - // Fire the channelConnected event for OioAcceptedSocketChannel. - // See #287 - fireConnected = false; - fireChannelConnected(channel, channel.getRemoteAddress()); - } - synchronized (channel.interestOpsLock) { while (!channel.isReadable()) { try { @@ -76,29 +68,25 @@ abstract class AbstractOioWorker implements Worker } } + boolean cont = false; try { - boolean cont = process(); - + cont = process(); + } catch (Throwable t) { + if (!channel.isSocketClosed()) { + fireExceptionCaught(channel, t); + } + } finally { processEventQueue(); if (!cont) { break; } - } catch (Throwable t) { - if (!channel.isSocketClosed()) { - fireExceptionCaught(channel, t); - } - - break; } } // Setting the workerThread to null will prevent any channel // operations from interrupting this thread from now on. channel.workerThread = null; - - // execute all events that are in the queue now - processEventQueue(); // Clean up. close(channel, succeededFuture(channel), true); @@ -106,7 +94,9 @@ abstract class AbstractOioWorker implements Worker // Mark the worker event loop as done so we know that we need to run tasks directly and not queue them // See #287 done = true; - + + // just to make we don't have something left + processEventQueue(); } diff --git a/src/main/java/org/jboss/netty/channel/socket/oio/OioWorker.java b/src/main/java/org/jboss/netty/channel/socket/oio/OioWorker.java index d994579249..a05f37d676 100644 --- a/src/main/java/org/jboss/netty/channel/socket/oio/OioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/oio/OioWorker.java @@ -40,6 +40,18 @@ class OioWorker extends AbstractOioWorker { super(channel); } + @Override + public void run() { + boolean fireConnected = channel instanceof OioAcceptedSocketChannel; + if (fireConnected && channel.isOpen()) { + // Fire the channelConnected event for OioAcceptedSocketChannel. + // See #287 + fireChannelConnected(channel, channel.getRemoteAddress()); + + } + super.run(); + } + @Override boolean process() throws IOException { byte[] buf;