diff --git a/transport/src/main/java/io/netty/channel/ChannelFuture.java b/transport/src/main/java/io/netty/channel/ChannelFuture.java index c984285992..7abe440268 100644 --- a/transport/src/main/java/io/netty/channel/ChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/ChannelFuture.java @@ -322,4 +322,12 @@ public interface ChannelFuture { * the specified time limit */ boolean awaitUninterruptibly(long timeoutMillis); + + /** + * A {@link ChannelFuture} which is not allowed to be sent to {@link ChannelPipeline} due to + * implementation details. + */ + interface Unsafe extends ChannelFuture { + // Tag interface + } } diff --git a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java index ee7eb80020..04f2fec695 100644 --- a/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java +++ b/transport/src/main/java/io/netty/channel/DefaultChannelPipeline.java @@ -858,6 +858,12 @@ public class DefaultChannelPipeline implements ChannelPipeline { throw new IllegalArgumentException(String.format( "future.channel does not match: %s (expected: %s)", future.channel(), channel())); } + if (future.isDone()) { + throw new IllegalArgumentException("future already done"); + } + if (future instanceof ChannelFuture.Unsafe) { + throw new IllegalArgumentException("internal use only future not allowed"); + } } private DefaultChannelHandlerContext firstInboundContext() { diff --git a/transport/src/main/java/io/netty/channel/VoidChannelFuture.java b/transport/src/main/java/io/netty/channel/VoidChannelFuture.java index 226b255358..86d32c4656 100644 --- a/transport/src/main/java/io/netty/channel/VoidChannelFuture.java +++ b/transport/src/main/java/io/netty/channel/VoidChannelFuture.java @@ -1,14 +1,8 @@ package io.netty.channel; -import io.netty.logging.InternalLogger; -import io.netty.logging.InternalLoggerFactory; - import java.util.concurrent.TimeUnit; -public class VoidChannelFuture implements ChannelFuture { - - private static final InternalLogger logger = - InternalLoggerFactory.getInstance(VoidChannelFuture.class); +public class VoidChannelFuture implements ChannelFuture.Unsafe { private final Channel channel;