Home / Class/ DirectArena Class — netty Architecture

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);
            }
        }

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