DirectArena Class — netty Architecture
Architecture documentation for the DirectArena class in PoolArena.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 36625935_0489_2b34_5e92_67f0dfdfa3f7["DirectArena"] 22b08479_a3b8_e618_f86f_ad3544d470e6["PoolArena.java"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|defined in| 22b08479_a3b8_e618_f86f_ad3544d470e6 ae076191_56d8_d25c_35e3_48328a45ff16["DirectArena()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| ae076191_56d8_d25c_35e3_48328a45ff16 49c0731d_5d29_754c_cdc8_2d879811133e["isDirect()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| 49c0731d_5d29_754c_cdc8_2d879811133e b8ab6098_b4e9_e66a_d754_9d7b407f96df["newChunk()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| b8ab6098_b4e9_e66a_d754_9d7b407f96df 9668a0e5_b21e_902e_bdb0_357e4fed6606["newUnpooledChunk()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| 9668a0e5_b21e_902e_bdb0_357e4fed6606 63f9ddfd_805a_8590_3b79_945372b1708c["CleanableDirectBuffer()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| 63f9ddfd_805a_8590_3b79_945372b1708c 09ce1d36_7062_d432_22b9_44d0dd70bb15["destroyChunk()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| 09ce1d36_7062_d432_22b9_44d0dd70bb15 655554c5_fa98_ac77_8032_ee339e241100["newByteBuf()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| 655554c5_fa98_ac77_8032_ee339e241100 e25a8fa2_17a8_61a8_9327_a2eaa7ad8a18["memoryCopy()"] 36625935_0489_2b34_5e92_67f0dfdfa3f7 -->|method| e25a8fa2_17a8_61a8_9327_a2eaa7ad8a18
Relationship Graph
Source Code
buffer/src/main/java/io/netty/buffer/PoolArena.java lines 723–804
static final class DirectArena extends PoolArena<ByteBuffer> {
DirectArena(PooledByteBufAllocator parent, SizeClasses sizeClass) {
super(parent, sizeClass);
}
@Override
boolean isDirect() {
return true;
}
@Override
protected PoolChunk<ByteBuffer> newChunk(int pageSize, int maxPageIdx, int pageShifts, int chunkSize) {
if (sizeClass.directMemoryCacheAlignment == 0) {
CleanableDirectBuffer cleanableDirectBuffer = allocateDirect(chunkSize);
ByteBuffer memory = cleanableDirectBuffer.buffer();
return new PoolChunk<ByteBuffer>(this, cleanableDirectBuffer, memory, memory, pageSize, pageShifts,
chunkSize, maxPageIdx);
}
CleanableDirectBuffer cleanableDirectBuffer = allocateDirect(
chunkSize + sizeClass.directMemoryCacheAlignment);
final ByteBuffer base = cleanableDirectBuffer.buffer();
final ByteBuffer memory = PlatformDependent.alignDirectBuffer(base, sizeClass.directMemoryCacheAlignment);
return new PoolChunk<ByteBuffer>(this, cleanableDirectBuffer, base, memory, pageSize,
pageShifts, chunkSize, maxPageIdx);
}
@Override
protected PoolChunk<ByteBuffer> newUnpooledChunk(int capacity) {
if (sizeClass.directMemoryCacheAlignment == 0) {
CleanableDirectBuffer cleanableDirectBuffer = allocateDirect(capacity);
ByteBuffer memory = cleanableDirectBuffer.buffer();
return new PoolChunk<ByteBuffer>(this, cleanableDirectBuffer, memory, memory, capacity);
}
CleanableDirectBuffer cleanableDirectBuffer = allocateDirect(
capacity + sizeClass.directMemoryCacheAlignment);
final ByteBuffer base = cleanableDirectBuffer.buffer();
final ByteBuffer memory = PlatformDependent.alignDirectBuffer(base, sizeClass.directMemoryCacheAlignment);
return new PoolChunk<ByteBuffer>(this, cleanableDirectBuffer, base, memory, capacity);
}
private static CleanableDirectBuffer allocateDirect(int capacity) {
return PlatformDependent.allocateDirect(capacity);
}
@Override
protected void destroyChunk(PoolChunk<ByteBuffer> chunk) {
PooledByteBufAllocator.onDeallocateChunk(chunk, !chunk.unpooled);
chunk.cleanable.clean();
}
@Override
protected PooledByteBuf<ByteBuffer> newByteBuf(int maxCapacity) {
if (HAS_UNSAFE) {
return PooledUnsafeDirectByteBuf.newInstance(maxCapacity);
} else {
return PooledDirectByteBuf.newInstance(maxCapacity);
}
}
@Override
protected void memoryCopy(ByteBuffer src, int srcOffset, PooledByteBuf<ByteBuffer> dstBuf, int length) {
if (length == 0) {
return;
}
if (HAS_UNSAFE) {
PlatformDependent.copyMemory(
PlatformDependent.directBufferAddress(src) + srcOffset,
PlatformDependent.directBufferAddress(dstBuf.memory) + dstBuf.offset, length);
} else {
// We must duplicate the NIO buffers because they may be accessed by other Netty buffers.
src = src.duplicate();
ByteBuffer dst = dstBuf.internalNioBuffer();
src.position(srcOffset).limit(srcOffset + length);
dst.position(dstBuf.offset);
dst.put(src);
}
}
Source
Frequently Asked Questions
What is the DirectArena class?
DirectArena is a class in the netty codebase, defined in buffer/src/main/java/io/netty/buffer/PoolArena.java.
Where is DirectArena defined?
DirectArena is defined in buffer/src/main/java/io/netty/buffer/PoolArena.java at line 723.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free