From abb4e20d0b2a32a9225219be48b7024646234f95 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 17 May 2013 21:35:01 +0200 Subject: [PATCH] [#1369] Move ImmediateEventExecutor to common and let it access via a static * Also fix a bug there to return a correct implementation of ProgressivPRomi ImmediateEventExecutor --- .../concurrent/ImmediateEventExecutor.java | 32 +++++++++++++++---- .../util/concurrent/ImmediateExecutor.java | 3 ++ .../channel/group/DefaultChannelGroup.java | 4 +-- .../group/DefaultChannelGroupFuture.java | 1 + 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/io/netty/util/concurrent/ImmediateEventExecutor.java b/common/src/main/java/io/netty/util/concurrent/ImmediateEventExecutor.java index 789fdd9daa..c64761edd3 100644 --- a/common/src/main/java/io/netty/util/concurrent/ImmediateEventExecutor.java +++ b/common/src/main/java/io/netty/util/concurrent/ImmediateEventExecutor.java @@ -15,15 +15,17 @@ */ package io.netty.util.concurrent; -import io.netty.util.concurrent.AbstractEventExecutor; -import io.netty.util.concurrent.DefaultPromise; -import io.netty.util.concurrent.EventExecutor; -import io.netty.util.concurrent.EventExecutorGroup; -import io.netty.util.concurrent.Promise; - import java.util.concurrent.TimeUnit; -final class ImmediateEventExecutor extends AbstractEventExecutor { +/** + * {@link AbstractEventExecutor} which execute tasks in the callers thread. + */ +public final class ImmediateEventExecutor extends AbstractEventExecutor { + public static final ImmediateEventExecutor INSTANCE = new ImmediateEventExecutor(); + + private ImmediateEventExecutor() { + // use static instance + } @Override public EventExecutorGroup parent() { @@ -80,6 +82,11 @@ final class ImmediateEventExecutor extends AbstractEventExecutor { return new ImmediatePromise(this); } + @Override + public ProgressivePromise newProgressivePromise() { + return new ImmediateProgressivePromise(this); + } + static class ImmediatePromise extends DefaultPromise { ImmediatePromise(EventExecutor executor) { super(executor); @@ -90,4 +97,15 @@ final class ImmediateEventExecutor extends AbstractEventExecutor { // No check } } + + static class ImmediateProgressivePromise extends DefaultProgressivePromise { + ImmediateProgressivePromise(EventExecutor executor) { + super(executor); + } + + @Override + protected void checkDeadLock() { + // No check + } + } } diff --git a/common/src/main/java/io/netty/util/concurrent/ImmediateExecutor.java b/common/src/main/java/io/netty/util/concurrent/ImmediateExecutor.java index ca8c9d98e0..fa68e0b198 100644 --- a/common/src/main/java/io/netty/util/concurrent/ImmediateExecutor.java +++ b/common/src/main/java/io/netty/util/concurrent/ImmediateExecutor.java @@ -29,6 +29,9 @@ public final class ImmediateExecutor implements Executor { @Override public void execute(Runnable command) { + if (command == null) { + throw new NullPointerException("command"); + } command.run(); } } diff --git a/transport/src/main/java/io/netty/channel/group/DefaultChannelGroup.java b/transport/src/main/java/io/netty/channel/group/DefaultChannelGroup.java index 4d0dbe5923..930aa6894e 100644 --- a/transport/src/main/java/io/netty/channel/group/DefaultChannelGroup.java +++ b/transport/src/main/java/io/netty/channel/group/DefaultChannelGroup.java @@ -22,6 +22,7 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.FileRegion; import io.netty.channel.ServerChannel; import io.netty.util.concurrent.EventExecutor; +import io.netty.util.concurrent.ImmediateEventExecutor; import io.netty.util.internal.PlatformDependent; import java.util.AbstractSet; @@ -39,7 +40,6 @@ import java.util.concurrent.atomic.AtomicInteger; public class DefaultChannelGroup extends AbstractSet implements ChannelGroup { private static final AtomicInteger nextId = new AtomicInteger(); - private static final ImmediateEventExecutor DEFAULT_EXECUTOR = new ImmediateEventExecutor(); private final String name; private final EventExecutor executor; private final ConcurrentMap serverChannels = PlatformDependent.newConcurrentHashMap(); @@ -72,7 +72,7 @@ public class DefaultChannelGroup extends AbstractSet implements Channel * is done against group names. */ public DefaultChannelGroup(String name) { - this(name, DEFAULT_EXECUTOR); + this(name, ImmediateEventExecutor.INSTANCE); } /** diff --git a/transport/src/main/java/io/netty/channel/group/DefaultChannelGroupFuture.java b/transport/src/main/java/io/netty/channel/group/DefaultChannelGroupFuture.java index d30823bc56..1b3dbb2bb5 100644 --- a/transport/src/main/java/io/netty/channel/group/DefaultChannelGroupFuture.java +++ b/transport/src/main/java/io/netty/channel/group/DefaultChannelGroupFuture.java @@ -23,6 +23,7 @@ import io.netty.util.concurrent.DefaultPromise; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; +import io.netty.util.concurrent.ImmediateEventExecutor; import java.util.ArrayList; import java.util.Collection;