Home / Class/ NativeDatagramPacketArray Class — netty Architecture

NativeDatagramPacketArray Class — netty Architecture

Architecture documentation for the NativeDatagramPacketArray class in NativeDatagramPacketArray.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  89d8e64d_0d21_7947_7ca7_74069c6c6608["NativeDatagramPacketArray"]
  b2cbda6d_cb9e_3f7b_72f8_26519849d735["NativeDatagramPacketArray.java"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|defined in| b2cbda6d_cb9e_3f7b_72f8_26519849d735
  f91d3857_6259_7b2a_810a_5680dce1c759["NativeDatagramPacketArray()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| f91d3857_6259_7b2a_810a_5680dce1c759
  caf38c70_dc92_8ef9_b463_dbdd2f1d301f["addWritable()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| caf38c70_dc92_8ef9_b463_dbdd2f1d301f
  3f127df8_c158_c9df_275e_c99e90486d95["add0()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| 3f127df8_c158_c9df_275e_c99e90486d95
  b215023b_7c8c_600d_d61d_48014fe73e1c["add()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| b215023b_7c8c_600d_d61d_48014fe73e1c
  08468dbc_2d10_46fc_a4cd_317c936674e1["count()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| 08468dbc_2d10_46fc_a4cd_317c936674e1
  f9be36ca_0d5e_5e0c_5ebc_1a9055432c08["packets()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| f9be36ca_0d5e_5e0c_5ebc_1a9055432c08
  59c0f5db_3506_47bb_e710_7e74801bb88f["clear()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| 59c0f5db_3506_47bb_e710_7e74801bb88f
  62cd9669_d37d_71fd_5df5_786bad9dcfd8["release()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| 62cd9669_d37d_71fd_5df5_786bad9dcfd8
  75d76110_b3a4_4da0_f713_77a8d5787a85["InetSocketAddress()"]
  89d8e64d_0d21_7947_7ca7_74069c6c6608 -->|method| 75d76110_b3a4_4da0_f713_77a8d5787a85

Relationship Graph

Source Code

transport-classes-epoll/src/main/java/io/netty/channel/epoll/NativeDatagramPacketArray.java lines 38–232

final class NativeDatagramPacketArray {

    // Use UIO_MAX_IOV as this is the maximum number we can write with one sendmmsg(...) call.
    private final NativeDatagramPacket[] packets = new NativeDatagramPacket[UIO_MAX_IOV];

    // We share one IovArray for all NativeDatagramPackets to reduce memory overhead. This will allow us to write
    // up to IOV_MAX iovec across all messages in one sendmmsg(...) call.
    private final IovArray iovArray = new IovArray();

    // temporary array to copy the ipv4 part of ipv6-mapped-ipv4 addresses and then create a Inet4Address out of it.
    private final byte[] ipv4Bytes = new byte[4];
    private final MyMessageProcessor processor = new MyMessageProcessor();

    private int count;

    NativeDatagramPacketArray() {
        for (int i = 0; i < packets.length; i++) {
            packets[i] = new NativeDatagramPacket();
        }
    }

    boolean addWritable(ByteBuf buf, int index, int len) {
        return add0(buf, index, len, 0, null);
    }

    private boolean add0(ByteBuf buf, int index, int len, int segmentLen, InetSocketAddress recipient) {
        if (count == packets.length) {
            // We already filled up to UIO_MAX_IOV messages. This is the max allowed per
            // recvmmsg(...) / sendmmsg(...) call, we will try again later.
            return false;
        }
        if (len == 0) {
            return true;
        }
        int offset = iovArray.count();
        if (offset == Limits.IOV_MAX || !iovArray.add(buf, index, len)) {
            // Not enough space to hold the whole content, we will try again later.
            return false;
        }
        NativeDatagramPacket p = packets[count];
        p.init(iovArray.memoryAddress(offset), iovArray.count() - offset, segmentLen, recipient);

        count++;
        return true;
    }

    void add(ChannelOutboundBuffer buffer, boolean connected, int maxMessagesPerWrite) throws Exception {
        processor.connected = connected;
        processor.maxMessagesPerWrite = maxMessagesPerWrite;
        buffer.forEachFlushedMessage(processor);
    }

    /**
     * Returns the count
     */
    int count() {
        return count;
    }

    /**
     * Returns an array with {@link #count()} {@link NativeDatagramPacket}s filled.
     */
    NativeDatagramPacket[] packets() {
        return packets;
    }

    void clear() {
        this.count = 0;
        this.iovArray.clear();
    }

    void release() {
        iovArray.release();
    }

    private final class MyMessageProcessor implements MessageProcessor {
        private boolean connected;
        private int maxMessagesPerWrite;

        @Override
        public boolean processMessage(Object msg) {

Frequently Asked Questions

What is the NativeDatagramPacketArray class?
NativeDatagramPacketArray is a class in the netty codebase, defined in transport-classes-epoll/src/main/java/io/netty/channel/epoll/NativeDatagramPacketArray.java.
Where is NativeDatagramPacketArray defined?
NativeDatagramPacketArray is defined in transport-classes-epoll/src/main/java/io/netty/channel/epoll/NativeDatagramPacketArray.java at line 38.

Analyze Your Own Codebase

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

Try Supermodel Free