diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/AbstractScptChannelSink.java b/transport-sctp/src/main/java/io/netty/channel/sctp/AbstractScptChannelSink.java index ebb42a2a93..642cd891b1 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/AbstractScptChannelSink.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/AbstractScptChannelSink.java @@ -28,13 +28,18 @@ public abstract class AbstractScptChannelSink extends AbstractChannelSink{ Channel ch = e.getChannel(); if (ch instanceof SctpChannelImpl) { SctpChannelImpl channel = (SctpChannelImpl) ch; - channel.worker.fireEventLater(new Runnable() { + // check if the current thread is a worker thread, and only fire the event later if thats not the case + if (channel.worker.thread != Thread.currentThread()) { + channel.worker.fireEventLater(new Runnable() { - @Override - public void run() { - pipeline.sendUpstream(e); - } - }); + @Override + public void run() { + pipeline.sendUpstream(e); + } + }); + } else { + pipeline.sendUpstream(e); + } } else { throw new UnsupportedOperationException(); } diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java index ea6f9710a7..e546019da3 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpWorker.java @@ -65,7 +65,7 @@ class SctpWorker implements Worker { private final Executor executor; private boolean started; - private volatile Thread thread; + volatile Thread thread; volatile Selector selector; private final AtomicBoolean wakenUp = new AtomicBoolean(); private final ReadWriteLock selectorGuard = new ReentrantReadWriteLock(); diff --git a/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannelSink.java b/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannelSink.java index 879a5d433a..6812b59a58 100644 --- a/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannelSink.java +++ b/transport/src/main/java/io/netty/channel/socket/nio/AbstractNioChannelSink.java @@ -28,13 +28,18 @@ public abstract class AbstractNioChannelSink extends AbstractChannelSink{ Channel ch = e.getChannel(); if (ch instanceof AbstractNioChannel) { AbstractNioChannel channel = (AbstractNioChannel) ch; - channel.worker.fireEventLater(new Runnable() { + // check if the current thread is a worker thread if so we can send the event now + if (channel.worker.thread != Thread.currentThread()) { + channel.worker.fireEventLater(new Runnable() { - @Override - public void run() { - pipeline.sendUpstream(e); - } - }); + @Override + public void run() { + pipeline.sendUpstream(e); + } + }); + } else { + pipeline.sendUpstream(e); + } } else { throw new UnsupportedOperationException(); } diff --git a/transport/src/main/java/io/netty/channel/socket/oio/AbstractOioChannelSink.java b/transport/src/main/java/io/netty/channel/socket/oio/AbstractOioChannelSink.java index 00e480a446..4a7a1a998c 100644 --- a/transport/src/main/java/io/netty/channel/socket/oio/AbstractOioChannelSink.java +++ b/transport/src/main/java/io/netty/channel/socket/oio/AbstractOioChannelSink.java @@ -30,7 +30,7 @@ public abstract class AbstractOioChannelSink extends AbstractChannelSink{ if (ch instanceof AbstractOioChannel) { AbstractOioChannel channel = (AbstractOioChannel) ch; Worker worker = channel.worker; - if (worker != null) { + if (worker != null && channel.workerThread != Thread.currentThread()) { channel.worker.fireEventLater(new Runnable() { @Override @@ -39,7 +39,7 @@ public abstract class AbstractOioChannelSink extends AbstractChannelSink{ } }); } else { - // no worker thread yet so just fire the event now + // no worker thread yet or the current thread is a worker thread so just fire the event now pipeline.sendUpstream(e); }