diff --git a/buffer/src/main/java/io/netty/buffer/PooledByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledByteBuf.java index 3f88a69713..64ca85480e 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledByteBuf.java @@ -17,13 +17,14 @@ package io.netty.buffer; import io.netty.util.Recycler; +import io.netty.util.Recycler.Handle; import java.nio.ByteBuffer; import java.nio.ByteOrder; abstract class PooledByteBuf extends AbstractReferenceCountedByteBuf { - private final Recycler.Handle recyclerHandle; + private final Recycler.Handle> recyclerHandle; protected PoolChunk chunk; protected long handle; @@ -34,9 +35,10 @@ abstract class PooledByteBuf extends AbstractReferenceCountedByteBuf { private ByteBuffer tmpNioBuf; - protected PooledByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { + @SuppressWarnings("unchecked") + protected PooledByteBuf(Recycler.Handle> recyclerHandle, int maxCapacity) { super(maxCapacity); - this.recyclerHandle = recyclerHandle; + this.recyclerHandle = (Handle>) recyclerHandle; } void init(PoolChunk chunk, long handle, int offset, int length, int maxLength) { @@ -147,14 +149,9 @@ abstract class PooledByteBuf extends AbstractReferenceCountedByteBuf { @SuppressWarnings("unchecked") private void recycle() { - Recycler.Handle recyclerHandle = this.recyclerHandle; - if (recyclerHandle != null) { - ((Recycler) recycler()).recycle(this, recyclerHandle); - } + recyclerHandle.recycle(this); } - protected abstract Recycler recycler(); - protected final int idx(int index) { return offset + index; } diff --git a/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java index b50f720637..c1475b3a91 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledDirectByteBuf.java @@ -30,7 +30,7 @@ final class PooledDirectByteBuf extends PooledByteBuf { private static final Recycler RECYCLER = new Recycler() { @Override - protected PooledDirectByteBuf newObject(Handle handle) { + protected PooledDirectByteBuf newObject(Handle handle) { return new PooledDirectByteBuf(handle, 0); } }; @@ -42,7 +42,7 @@ final class PooledDirectByteBuf extends PooledByteBuf { return buf; } - private PooledDirectByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { + private PooledDirectByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { super(recyclerHandle, maxCapacity); } @@ -369,9 +369,4 @@ final class PooledDirectByteBuf extends PooledByteBuf { public long memoryAddress() { throw new UnsupportedOperationException(); } - - @Override - protected Recycler recycler() { - return RECYCLER; - } } diff --git a/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java index 1eb445b04e..f48c5cc160 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledHeapByteBuf.java @@ -29,7 +29,7 @@ final class PooledHeapByteBuf extends PooledByteBuf { private static final Recycler RECYCLER = new Recycler() { @Override - protected PooledHeapByteBuf newObject(Handle handle) { + protected PooledHeapByteBuf newObject(Handle handle) { return new PooledHeapByteBuf(handle, 0); } }; @@ -41,7 +41,7 @@ final class PooledHeapByteBuf extends PooledByteBuf { return buf; } - private PooledHeapByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { + private PooledHeapByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { super(recyclerHandle, maxCapacity); } @@ -299,9 +299,4 @@ final class PooledHeapByteBuf extends PooledByteBuf { protected ByteBuffer newInternalNioBuffer(byte[] memory) { return ByteBuffer.wrap(memory); } - - @Override - protected Recycler recycler() { - return RECYCLER; - } } diff --git a/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java b/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java index 92bd6ef423..6149100acf 100644 --- a/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/PooledUnsafeDirectByteBuf.java @@ -34,7 +34,7 @@ final class PooledUnsafeDirectByteBuf extends PooledByteBuf { private static final Recycler RECYCLER = new Recycler() { @Override - protected PooledUnsafeDirectByteBuf newObject(Handle handle) { + protected PooledUnsafeDirectByteBuf newObject(Handle handle) { return new PooledUnsafeDirectByteBuf(handle, 0); } }; @@ -48,7 +48,7 @@ final class PooledUnsafeDirectByteBuf extends PooledByteBuf { private long memoryAddress; - private PooledUnsafeDirectByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { + private PooledUnsafeDirectByteBuf(Recycler.Handle recyclerHandle, int maxCapacity) { super(recyclerHandle, maxCapacity); } @@ -381,9 +381,4 @@ final class PooledUnsafeDirectByteBuf extends PooledByteBuf { private long addr(int index) { return memoryAddress + index; } - - @Override - protected Recycler recycler() { - return RECYCLER; - } } diff --git a/common/src/main/java/io/netty/util/Recycler.java b/common/src/main/java/io/netty/util/Recycler.java index c162da0186..da8aafe552 100644 --- a/common/src/main/java/io/netty/util/Recycler.java +++ b/common/src/main/java/io/netty/util/Recycler.java @@ -42,7 +42,7 @@ public abstract class Recycler { return o; } - public final boolean recycle(T o, Handle handle) { + public final boolean recycle(T o, Handle handle) { @SuppressWarnings("unchecked") Stack stack = (Stack) handle; if (stack.parent != this) { @@ -57,11 +57,13 @@ public abstract class Recycler { return true; } - protected abstract T newObject(Handle handle); + protected abstract T newObject(Handle handle); - public interface Handle { } + public interface Handle { + void recycle(T object); + } - static final class Stack implements Handle { + static final class Stack implements Handle { private static final int INITIAL_CAPACITY = 256; @@ -78,6 +80,11 @@ public abstract class Recycler { elements = newArray(INITIAL_CAPACITY); } + @Override + public void recycle(T object) { + parent.recycle(object, this); + } + T pop() { int size = this.size; if (size == 0) { diff --git a/common/src/main/java/io/netty/util/internal/PendingWrite.java b/common/src/main/java/io/netty/util/internal/PendingWrite.java index c731dab60f..8621aba585 100644 --- a/common/src/main/java/io/netty/util/internal/PendingWrite.java +++ b/common/src/main/java/io/netty/util/internal/PendingWrite.java @@ -25,7 +25,7 @@ import io.netty.util.concurrent.Promise; public final class PendingWrite { private static final Recycler RECYCLER = new Recycler() { @Override - protected PendingWrite newObject(Handle handle) { + protected PendingWrite newObject(Handle handle) { return new PendingWrite(handle); } }; @@ -40,11 +40,11 @@ public final class PendingWrite { return pending; } - private final Recycler.Handle handle; + private final Recycler.Handle handle; private Object msg; private Promise promise; - private PendingWrite(Recycler.Handle handle) { + private PendingWrite(Recycler.Handle handle) { this.handle = handle; } diff --git a/common/src/main/java/io/netty/util/internal/RecyclableArrayList.java b/common/src/main/java/io/netty/util/internal/RecyclableArrayList.java index 2f9668d497..9a4214f9a6 100644 --- a/common/src/main/java/io/netty/util/internal/RecyclableArrayList.java +++ b/common/src/main/java/io/netty/util/internal/RecyclableArrayList.java @@ -35,7 +35,7 @@ public final class RecyclableArrayList extends ArrayList { private static final Recycler RECYCLER = new Recycler() { @Override - protected RecyclableArrayList newObject(Handle handle) { + protected RecyclableArrayList newObject(Handle handle) { return new RecyclableArrayList(handle); } }; @@ -56,13 +56,13 @@ public final class RecyclableArrayList extends ArrayList { return ret; } - private final Handle handle; + private final Handle handle; - private RecyclableArrayList(Handle handle) { + private RecyclableArrayList(Handle handle) { this(handle, DEFAULT_INITIAL_CAPACITY); } - private RecyclableArrayList(Handle handle, int initialCapacity) { + private RecyclableArrayList(Handle handle, int initialCapacity) { super(initialCapacity); this.handle = handle; } diff --git a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java index 0dbdccaaa4..5cdcba11f3 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java +++ b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java @@ -57,7 +57,7 @@ public final class ChannelOutboundBuffer { private static final Recycler RECYCLER = new Recycler() { @Override - protected ChannelOutboundBuffer newObject(Handle handle) { + protected ChannelOutboundBuffer newObject(Handle handle) { return new ChannelOutboundBuffer(handle); } }; @@ -70,7 +70,7 @@ public final class ChannelOutboundBuffer { return buffer; } - private final Handle handle; + private final Handle handle; private AbstractChannel channel; @@ -98,7 +98,7 @@ public final class ChannelOutboundBuffer { private volatile int writable = 1; - private ChannelOutboundBuffer(Handle handle) { + private ChannelOutboundBuffer(Handle handle) { this.handle = handle; buffer = new Entry[INITIAL_CAPACITY]; @@ -618,16 +618,16 @@ public final class ChannelOutboundBuffer { } static final class ThreadLocalPooledByteBuf extends UnpooledDirectByteBuf { - private final Recycler.Handle handle; + private final Recycler.Handle handle; private static final Recycler RECYCLER = new Recycler() { @Override - protected ThreadLocalPooledByteBuf newObject(Handle handle) { + protected ThreadLocalPooledByteBuf newObject(Handle handle) { return new ThreadLocalPooledByteBuf(handle); } }; - private ThreadLocalPooledByteBuf(Recycler.Handle handle) { + private ThreadLocalPooledByteBuf(Recycler.Handle handle) { super(UnpooledByteBufAllocator.DEFAULT, 256, Integer.MAX_VALUE); this.handle = handle; }