Home / Function/ scatteringRead() — netty Function Reference

scatteringRead() — netty Function Reference

Architecture documentation for the scatteringRead() function in EpollDatagramChannel.java from the netty codebase.

Function java Buffer Telemetry calls 4 called by 1

Entity Profile

Dependency Diagram

graph TD
  7cf07df9_4be2_ed29_9353_cac4c09b8739["scatteringRead()"]
  dab3c3bb_b3e2_f3b8_e8e0_37c99496afe9["EpollDatagramChannel"]
  7cf07df9_4be2_ed29_9353_cac4c09b8739 -->|defined in| dab3c3bb_b3e2_f3b8_e8e0_37c99496afe9
  0ad4ff23_5654_f57a_1eda_1a36ffc34db3["epollInReady()"]
  0ad4ff23_5654_f57a_1eda_1a36ffc34db3 -->|calls| 7cf07df9_4be2_ed29_9353_cac4c09b8739
  0a5c9ebd_9542_c721_3007_ef54d1145fdc["processPacket()"]
  7cf07df9_4be2_ed29_9353_cac4c09b8739 -->|calls| 0a5c9ebd_9542_c721_3007_ef54d1145fdc
  da43f51f_6e9f_7e6c_396a_89c96150f970["addDatagramPacketToOut()"]
  7cf07df9_4be2_ed29_9353_cac4c09b8739 -->|calls| da43f51f_6e9f_7e6c_396a_89c96150f970
  f06c6fde_39f9_620f_9dae_c0903795968e["processPacketList()"]
  7cf07df9_4be2_ed29_9353_cac4c09b8739 -->|calls| f06c6fde_39f9_620f_9dae_c0903795968e
  0d502a62_d670_7011_9c8e_157dd8f2fb61["releaseAndRecycle()"]
  7cf07df9_4be2_ed29_9353_cac4c09b8739 -->|calls| 0d502a62_d670_7011_9c8e_157dd8f2fb61
  style 7cf07df9_4be2_ed29_9353_cac4c09b8739 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

transport-classes-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java lines 755–813

    private boolean scatteringRead(EpollRecvByteAllocatorHandle allocHandle, NativeDatagramPacketArray array,
            ByteBuf byteBuf, int datagramSize, int numDatagram) throws IOException {
        RecyclableArrayList datagramPackets = null;
        try {
            int offset = byteBuf.writerIndex();
            for (int i = 0; i < numDatagram;  i++, offset += datagramSize) {
                if (!array.addWritable(byteBuf, offset, datagramSize)) {
                    break;
                }
            }

            allocHandle.attemptedBytesRead(offset - byteBuf.writerIndex());

            NativeDatagramPacketArray.NativeDatagramPacket[] packets = array.packets();

            int received = socket.recvmmsg(packets, 0, array.count());
            if (received == 0) {
                allocHandle.lastBytesRead(-1);
                return false;
            }

            InetSocketAddress local = localAddress();

            // Set the writerIndex too the maximum number of bytes we might have read.
            int bytesReceived = received * datagramSize;
            byteBuf.writerIndex(byteBuf.writerIndex() + bytesReceived);

            if (received == 1) {
                // Single packet fast-path
                DatagramPacket packet = packets[0].newDatagramPacket(byteBuf, local);
                if (!(packet instanceof io.netty.channel.unix.SegmentedDatagramPacket)) {
                    processPacket(pipeline(), allocHandle, datagramSize, packet);
                    return true;
                }
            }
            // Its important that we process all received data out of the NativeDatagramPacketArray
            // before we call fireChannelRead(...). This is because the user may call flush()
            // in a channelRead(...) method and so may re-use the NativeDatagramPacketArray again.
            datagramPackets = RecyclableArrayList.newInstance();
            for (int i = 0; i < received; i++) {
                DatagramPacket packet = packets[i].newDatagramPacket(byteBuf, local);

                // We need to skip the maximum datagram size to ensure we have the readerIndex in the right position
                // for the next one.
                byteBuf.skipBytes(datagramSize);
                addDatagramPacketToOut(packet, datagramPackets);
            }
            // Ass we did use readRetainedSlice(...) before we should now release the byteBuf and null it out.
            byteBuf.release();
            byteBuf = null;

            processPacketList(pipeline(), allocHandle, bytesReceived, datagramPackets);
            datagramPackets.recycle();
            datagramPackets = null;
            return true;
        } finally {
            releaseAndRecycle(byteBuf, datagramPackets);
        }
    }

Domain

Subdomains

Called By

Frequently Asked Questions

What does scatteringRead() do?
scatteringRead() is a function in the netty codebase, defined in transport-classes-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java.
Where is scatteringRead() defined?
scatteringRead() is defined in transport-classes-epoll/src/main/java/io/netty/channel/epoll/EpollDatagramChannel.java at line 755.
What does scatteringRead() call?
scatteringRead() calls 4 function(s): addDatagramPacketToOut, processPacket, processPacketList, releaseAndRecycle.
What calls scatteringRead()?
scatteringRead() is called by 1 function(s): epollInReady.

Analyze Your Own Codebase

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

Try Supermodel Free