Home / Class/ SizeClassedChunk Class — netty Architecture

SizeClassedChunk Class — netty Architecture

Architecture documentation for the SizeClassedChunk class in AdaptivePoolingAllocator.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  0786b48a_6931_326c_822b_73a96aca1827["SizeClassedChunk"]
  fee3fa6d_a7fb_30d6_ea34_49602c633a2c["AdaptivePoolingAllocator.java"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|defined in| fee3fa6d_a7fb_30d6_ea34_49602c633a2c
  28c32680_05cd_e170_2197_6979d27d5251["SizeClassedChunk()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 28c32680_05cd_e170_2197_6979d27d5251
  124af09c_056b_fca2_ab69_30a58e494d89["readInitInto()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 124af09c_056b_fca2_ab69_30a58e494d89
  1c99e4d1_eab5_0574_2be2_1d396456cf4d["nextAvailableSegmentOffset()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 1c99e4d1_eab5_0574_2be2_1d396456cf4d
  0e3b39fd_2e5c_a191_86b4_5e63a6cbaad0["remainingCapacityOnFreeList()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 0e3b39fd_2e5c_a191_86b4_5e63a6cbaad0
  18f06c86_ea15_9251_9dc0_a0d73e197877["remainingCapacity()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 18f06c86_ea15_9251_9dc0_a0d73e197877
  53eff05b_d707_ed78_a7da_998e3c983cab["releaseSegmentOffsetIntoFreeList()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| 53eff05b_d707_ed78_a7da_998e3c983cab
  f1f91104_8721_329c_3138_235bb4f03863["releaseSegment()"]
  0786b48a_6931_326c_822b_73a96aca1827 -->|method| f1f91104_8721_329c_3138_235bb4f03863

Relationship Graph

Source Code

buffer/src/main/java/io/netty/buffer/AdaptivePoolingAllocator.java lines 1252–1354

    private static final class SizeClassedChunk extends Chunk {
        private static final int FREE_LIST_EMPTY = -1;
        private final int segmentSize;
        private final MpscIntQueue externalFreeList;
        private final IntStack localFreeList;
        private Thread ownerThread;

        SizeClassedChunk(AbstractByteBuf delegate, Magazine magazine,
                         SizeClassChunkController controller) {
            super(delegate, magazine, true);
            segmentSize = controller.segmentSize;
            ownerThread = magazine.group.ownerThread;
            if (ownerThread == null) {
                externalFreeList = controller.createFreeList();
                localFreeList = null;
            } else {
                externalFreeList = controller.createEmptyFreeList();
                localFreeList = controller.createLocalFreeList();
            }
        }

        @Override
        public boolean readInitInto(AdaptiveByteBuf buf, int size, int startingCapacity, int maxCapacity) {
            final int startIndex = nextAvailableSegmentOffset();
            if (startIndex == FREE_LIST_EMPTY) {
                return false;
            }
            allocatedBytes += segmentSize;
            Chunk chunk = this;
            chunk.retain();
            try {
                buf.init(delegate, chunk, 0, 0, startIndex, size, startingCapacity, maxCapacity);
                chunk = null;
            } finally {
                if (chunk != null) {
                    // If chunk is not null we know that buf.init(...) failed and so we need to manually release
                    // the chunk again as we retained it before calling buf.init(...). Beside this we also need to
                    // restore the old allocatedBytes value.
                    allocatedBytes -= segmentSize;
                    chunk.releaseSegment(startIndex, startingCapacity);
                }
            }
            return true;
        }

        private int nextAvailableSegmentOffset() {
            final int startIndex;
            IntStack localFreeList = this.localFreeList;
            if (localFreeList != null) {
                assert Thread.currentThread() == ownerThread;
                if (localFreeList.isEmpty()) {
                    startIndex = externalFreeList.poll();
                } else {
                    startIndex = localFreeList.pop();
                }
            } else {
                startIndex = externalFreeList.poll();
            }
            return startIndex;
        }

        private int remainingCapacityOnFreeList() {
            final int segmentSize = this.segmentSize;
            int remainingCapacity = externalFreeList.size() * segmentSize;
            IntStack localFreeList = this.localFreeList;
            if (localFreeList != null) {
                assert Thread.currentThread() == ownerThread;
                remainingCapacity += localFreeList.size() * segmentSize;
            }
            return remainingCapacity;
        }

        @Override
        public int remainingCapacity() {
            int remainingCapacity = super.remainingCapacity();
            if (remainingCapacity > segmentSize) {
                return remainingCapacity;
            }
            int updatedRemainingCapacity = remainingCapacityOnFreeList();
            if (updatedRemainingCapacity == remainingCapacity) {
                return remainingCapacity;

Frequently Asked Questions

What is the SizeClassedChunk class?
SizeClassedChunk is a class in the netty codebase, defined in buffer/src/main/java/io/netty/buffer/AdaptivePoolingAllocator.java.
Where is SizeClassedChunk defined?
SizeClassedChunk is defined in buffer/src/main/java/io/netty/buffer/AdaptivePoolingAllocator.java at line 1252.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free