Home / Class/ IoUringSocketUnsafe Class — netty Architecture

IoUringSocketUnsafe Class — netty Architecture

Architecture documentation for the IoUringSocketUnsafe class in IoUringSocketChannel.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  e27b80ce_bfb2_8300_cc64_6e66bd077b74["IoUringSocketUnsafe"]
  14cc29cd_5951_1ece_1055_ff870dd87de5["IoUringSocketChannel.java"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|defined in| 14cc29cd_5951_1ece_1055_ff870dd87de5
  0541f6f7_9dc8_a4dc_7c1b_35f3cba0416f["scheduleWriteSingle()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| 0541f6f7_9dc8_a4dc_7c1b_35f3cba0416f
  9471c8f5_5044_ecfc_8b01_05388745f842["scheduleWriteMultiple()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| 9471c8f5_5044_ecfc_8b01_05388745f842
  44577e5e_5a86_7023_ae99_44135e519908["filterWriteMultiple()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| 44577e5e_5a86_7023_ae99_44135e519908
  dcd5c4bc_b917_8522_f921_423669622aee["writeComplete0()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| dcd5c4bc_b917_8522_f921_423669622aee
  626c6aa0_ad4d_dc38_b746_2ca9d0e89cfe["handleWriteCompleteZeroCopy()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| 626c6aa0_ad4d_dc38_b746_2ca9d0e89cfe
  c407f41d_0b12_e058_54db_d479a9fbc591["addFlushedToZcWriteQueue()"]
  e27b80ce_bfb2_8300_cc64_6e66bd077b74 -->|method| c407f41d_0b12_e058_54db_d479a9fbc591

Relationship Graph

Source Code

transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringSocketChannel.java lines 79–310

    private final class IoUringSocketUnsafe extends IoUringStreamUnsafe {
        /**
         * Queue that holds buffers that we can't release yet as the kernel still holds a reference to these.
         */
        private Queue<Object> zcWriteQueue;

        @Override
        protected int scheduleWriteSingle(Object msg) {
            assert writeId == 0;

            if (IoUring.isSendZcSupported() && msg instanceof ByteBuf) {
                ByteBuf buf = (ByteBuf) msg;
                int length = buf.readableBytes();
                if (((IoUringSocketChannelConfig) config()).shouldWriteZeroCopy(length)) {
                    long address = IoUring.memoryAddress(buf) + buf.readerIndex();
                    IoUringIoOps ops = IoUringIoOps.newSendZc(fd().intValue(), address, length, 0, nextOpsId(), 0);
                    byte opCode = ops.opcode();
                    writeId = registration().submit(ops);
                    writeOpCode = opCode;
                    if (writeId == 0) {
                        return 0;
                    }
                    return 1;
                }
                // Should not use send_zc, just use normal write.
            }
            return super.scheduleWriteSingle(msg);
        }

        @Override
        protected int scheduleWriteMultiple(ChannelOutboundBuffer in) {
            assert writeId == 0;

            IoUringSocketChannelConfig ioUringSocketChannelConfig = (IoUringSocketChannelConfig) config();
            //at least one buffer in the batch exceeds `IO_URING_WRITE_ZERO_COPY_THRESHOLD`.
            if (IoUring.isSendmsgZcSupported()
                    && (ioUringSocketChannelConfig.shouldWriteZeroCopy(((ByteBuf) in.current()).readableBytes()))) {
                IoUringIoHandler handler = registration().attachment();

                IovArray iovArray = handler.iovArray();
                int offset = iovArray.count();
                // Limit to the maximum number of fragments to ensure we don't get an error when we have too many
                // buffers.
                iovArray.maxCount(Native.MAX_SKB_FRAGS);
                try {
                    in.forEachFlushedMessage(new ChannelOutboundBuffer.MessageProcessor() {
                        @Override
                        public boolean processMessage(Object msg) throws Exception {
                            if (msg instanceof ByteBuf) {
                                ByteBuf buf = (ByteBuf) msg;
                                int length = buf.readableBytes();
                                if (ioUringSocketChannelConfig.shouldWriteZeroCopy(length)) {
                                    return iovArray.processMessage(msg);
                                }
                            }
                            return false;
                        }
                    });
                } catch (Exception e) {
                    // This should never happen, anyway fallback to single write.
                    return scheduleWriteSingle(in.current());
                }
                long iovArrayAddress = iovArray.memoryAddress(offset);
                int iovArrayLength = iovArray.count() - offset;

                MsgHdrMemoryArray msgHdrArray = handler.msgHdrMemoryArray();
                MsgHdrMemory hdr = msgHdrArray.nextHdr();
                assert hdr != null;
                hdr.set(iovArrayAddress, iovArrayLength);
                IoUringIoOps ops = IoUringIoOps.newSendmsgZc(fd().intValue(), (byte) 0, 0, hdr.address(), nextOpsId());
                byte opCode = ops.opcode();
                writeId = registration().submit(ops);
                writeOpCode = opCode;
                if (writeId == 0) {
                    return 0;
                }
                return 1;
            }
            // Should not use sendmsg_zc, just use normal writev.
            return super.scheduleWriteMultiple(in);
        }

Frequently Asked Questions

What is the IoUringSocketUnsafe class?
IoUringSocketUnsafe is a class in the netty codebase, defined in transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringSocketChannel.java.
Where is IoUringSocketUnsafe defined?
IoUringSocketUnsafe is defined in transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringSocketChannel.java at line 79.

Analyze Your Own Codebase

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

Try Supermodel Free