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);
}
Defined In
Source
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