diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java index 42166cd56f..ab40b49e0f 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java @@ -49,10 +49,11 @@ import org.jboss.netty.channel.socket.Worker; import org.jboss.netty.channel.socket.nio.SocketSendBufferPool.SendBuffer; import org.jboss.netty.logging.InternalLogger; import org.jboss.netty.logging.InternalLoggerFactory; +import org.jboss.netty.util.ExternalResourceReleasable; import org.jboss.netty.util.ThreadRenamingRunnable; import org.jboss.netty.util.internal.DeadLockProofWorker; -abstract class AbstractNioWorker implements Worker { +abstract class AbstractNioWorker implements Worker, ExternalResourceReleasable { private static final AtomicInteger nextId = new AtomicInteger(); @@ -902,6 +903,11 @@ abstract class AbstractNioWorker implements Worker { } } + + public void releaseExternalResources() { + sendBufferPool.releaseExternalResources(); + } + /** * Read is called when a Selector has been notified that the underlying channel * was something to be read. The channel would previously have registered its interest diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorkerPool.java b/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorkerPool.java index f2f6f66b9a..ab790e7394 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorkerPool.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorkerPool.java @@ -75,6 +75,9 @@ public abstract class AbstractNioWorkerPool public void releaseExternalResources() { ExecutorUtil.terminate(workerExecutor); + for (AbstractNioWorker worker: workers) { + worker.releaseExternalResources(); + } } } diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java index 381cf1c2e9..8123528dcd 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java @@ -110,6 +110,12 @@ public class NioDatagramWorker extends AbstractNioWorker { } + @Override + public void releaseExternalResources() { + super.releaseExternalResources(); + bufferAllocator.releaseExternalResources(); + } + @Override protected boolean scheduleWriteIfNecessary(final AbstractNioChannel channel) { final Thread workerThread = thread; diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java index 570f19b047..93545f118b 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java @@ -130,6 +130,12 @@ public class NioWorker extends AbstractNioWorker { return false; } + @Override + public void releaseExternalResources() { + super.releaseExternalResources(); + recvBufferPool.releaseExternalResources(); + } + @Override protected Runnable createRegisterTask(AbstractNioChannel channel, ChannelFuture future) { boolean server = !(channel instanceof NioClientSocketChannel); diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/SocketReceiveBufferAllocator.java b/src/main/java/org/jboss/netty/channel/socket/nio/SocketReceiveBufferAllocator.java index 684f605cf2..3f0c9d58a8 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/SocketReceiveBufferAllocator.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/SocketReceiveBufferAllocator.java @@ -17,9 +17,10 @@ package org.jboss.netty.channel.socket.nio; import java.nio.ByteBuffer; +import org.jboss.netty.util.ExternalResourceReleasable; import org.jboss.netty.util.internal.ByteBufferUtil; -final class SocketReceiveBufferAllocator { +final class SocketReceiveBufferAllocator implements ExternalResourceReleasable { private ByteBuffer buf; private int exceedCount; @@ -72,4 +73,10 @@ final class SocketReceiveBufferAllocator { } return q << 10; } + + public void releaseExternalResources() { + if (buf != null) { + ByteBufferUtil.destroy(buf); + } + } } diff --git a/src/main/java/org/jboss/netty/channel/socket/nio/SocketSendBufferPool.java b/src/main/java/org/jboss/netty/channel/socket/nio/SocketSendBufferPool.java index 72e4aec359..034cd682b6 100644 --- a/src/main/java/org/jboss/netty/channel/socket/nio/SocketSendBufferPool.java +++ b/src/main/java/org/jboss/netty/channel/socket/nio/SocketSendBufferPool.java @@ -27,8 +27,10 @@ import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.buffer.CompositeChannelBuffer; import org.jboss.netty.channel.DefaultFileRegion; import org.jboss.netty.channel.FileRegion; +import org.jboss.netty.util.ExternalResourceReleasable; +import org.jboss.netty.util.internal.ByteBufferUtil; -final class SocketSendBufferPool { +final class SocketSendBufferPool implements ExternalResourceReleasable { private static final SendBuffer EMPTY_BUFFER = new EmptySendBuffer(); @@ -383,4 +385,10 @@ final class SocketSendBufferPool { // Unpooled. } } + + public void releaseExternalResources() { + if (current.buffer != null) { + ByteBufferUtil.destroy(current.buffer); + } + } }