diff --git a/pom.xml b/pom.xml
index 83e21794..0d8dfef1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,7 +59,7 @@
unknown
- 4.0.0.Final-SNAPSHOT
+ 4.0.0.CR3
UTF-8
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
index 983dcf7f..7867165e 100644
--- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
+++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
@@ -9,17 +9,19 @@ public class ChannelWrapper
private final Channel ch;
@Getter
private volatile boolean closed;
+ private final ReusableChannelPromise promise;
public ChannelWrapper(Channel ch)
{
this.ch = ch;
+ this.promise = new ReusableChannelPromise( ch );
}
public synchronized void write(Object packet)
{
if ( !closed )
{
- ch.write( packet, ch.voidPromise() );
+ ch.write( packet, promise );
}
}
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ReusableChannelPromise.java b/proxy/src/main/java/net/md_5/bungee/netty/ReusableChannelPromise.java
new file mode 100644
index 00000000..f420909a
--- /dev/null
+++ b/proxy/src/main/java/net/md_5/bungee/netty/ReusableChannelPromise.java
@@ -0,0 +1,179 @@
+package net.md_5.bungee.netty;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelPromise;
+import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.GenericFutureListener;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public class ReusableChannelPromise implements ChannelPromise
+{
+
+ private final Channel ch;
+
+ @Override
+ public Channel channel()
+ {
+ return ch;
+ }
+
+ @Override
+ public ChannelPromise setSuccess(Void result)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise setSuccess()
+ {
+ return this;
+ }
+
+ @Override
+ public boolean trySuccess()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise setFailure(Throwable cause)
+ {
+ return this;
+ }
+
+ @Override
+ public ChannelPromise addListener(GenericFutureListener extends Future> listener)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise addListeners(GenericFutureListener extends Future>... listeners)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise removeListener(GenericFutureListener extends Future> listener)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise removeListeners(GenericFutureListener extends Future>... listeners)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise sync() throws InterruptedException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise syncUninterruptibly()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise await() throws InterruptedException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public ChannelPromise awaitUninterruptibly()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean isSuccess()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public Throwable cause()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean await(long timeout, TimeUnit unit) throws InterruptedException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean await(long timeoutMillis) throws InterruptedException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean awaitUninterruptibly(long timeout, TimeUnit unit)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean awaitUninterruptibly(long timeoutMillis)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public Void getNow()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean cancel(boolean mayInterruptIfRunning)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean isCancelled()
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean isDone()
+ {
+ return false;
+ }
+
+ @Override
+ public Void get() throws InterruptedException, ExecutionException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public Void get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean trySuccess(Void result)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+
+ @Override
+ public boolean tryFailure(Throwable cause)
+ {
+ throw new UnsupportedOperationException( "Not supported yet." );
+ }
+}