IoUringIoHandler Class — netty Architecture
Architecture documentation for the IoUringIoHandler class in IoUringIoHandler.java from the netty codebase.
Entity Profile
Dependency Diagram
graph TD 54b1e24c_acd2_7686_4313_2695f1b73de1["IoUringIoHandler"] b567715e_8085_11b5_5111_a83c7d3cb07a["IoUringIoHandler.java"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|defined in| b567715e_8085_11b5_5111_a83c7d3cb07a 93ab6411_80c6_9a81_f28e_b57b1244b57d["IoUringIoHandler()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 93ab6411_80c6_9a81_f28e_b57b1244b57d ae7b43b6_7025_8de0_c191_8db422c1309d["initialize()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| ae7b43b6_7025_8de0_c191_8db422c1309d 3febc8f5_f331_c39c_6774_12a24143add8["run()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 3febc8f5_f331_c39c_6774_12a24143add8 00f4b33f_14c8_6a03_69e4_20eca4fce924["processCompletionsAndHandleOverflow()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 00f4b33f_14c8_6a03_69e4_20eca4fce924 b5491639_cc1a_93b0_792f_d7ada8778728["submitAndClearNow()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| b5491639_cc1a_93b0_792f_d7ada8778728 d8db468b_8a77_90be_b134_4ff923043d64["IoUringBufferRing()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| d8db468b_8a77_90be_b134_4ff923043d64 359a5d6c_421e_c511_0fdf_290ebeb76e2b["handleLoopException()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 359a5d6c_421e_c511_0fdf_290ebeb76e2b 3dd4563f_fb58_41cc_3ce1_aa727be6023e["handle()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 3dd4563f_fb58_41cc_3ce1_aa727be6023e ec53e717_3dad_e2d1_9310_0ebe35ed748a["handleEventFdRead()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| ec53e717_3dad_e2d1_9310_0ebe35ed748a 5de35c14_38b4_da68_9364_e35d6355eda9["submitEventFdRead()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 5de35c14_38b4_da68_9364_e35d6355eda9 d9450b94_1e0b_e88a_fddc_604693afc7b9["submitAndWaitWithTimeout()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| d9450b94_1e0b_e88a_fddc_604693afc7b9 88492ff3_9115_7f63_0291_32ae2900e2a2["prepareToDestroy()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 88492ff3_9115_7f63_0291_32ae2900e2a2 093f8eee_4384_b7ac_3228_6a911c17e627["destroy()"] 54b1e24c_acd2_7686_4313_2695f1b73de1 -->|method| 093f8eee_4384_b7ac_3228_6a911c17e627
Relationship Graph
Source Code
transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringIoHandler.java lines 53–704
public final class IoUringIoHandler implements IoHandler {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(IoUringIoHandler.class);
private final RingBuffer ringBuffer;
private final IntObjectMap<IoUringBufferRing> registeredIoUringBufferRing;
private final IntObjectMap<DefaultIoUringIoRegistration> registrations;
// The maximum number of bytes for an InetAddress / Inet6Address
private final byte[] inet4AddressArray = new byte[SockaddrIn.IPV4_ADDRESS_LENGTH];
private final byte[] inet6AddressArray = new byte[SockaddrIn.IPV6_ADDRESS_LENGTH];
private final AtomicBoolean eventfdAsyncNotify = new AtomicBoolean();
private final FileDescriptor eventfd;
private final CleanableDirectBuffer eventfdReadBufCleanable;
private final ByteBuffer eventfdReadBuf;
private final long eventfdReadBufAddress;
private final CleanableDirectBuffer timeoutMemoryCleanable;
private final ByteBuffer timeoutMemory;
private final long timeoutMemoryAddress;
private final IovArray iovArray;
private final MsgHdrMemoryArray msgHdrMemoryArray;
private long eventfdReadSubmitted;
private boolean eventFdClosing;
private volatile boolean shuttingDown;
private boolean closeCompleted;
private int nextRegistrationId = Integer.MIN_VALUE;
// these two ids are used internally any so can't be used by nextRegistrationId().
private static final int EVENTFD_ID = Integer.MAX_VALUE;
private static final int RINGFD_ID = EVENTFD_ID - 1;
private static final int INVALID_ID = 0;
private static final int KERNEL_TIMESPEC_SIZE = 16; //__kernel_timespec
private static final int KERNEL_TIMESPEC_TV_SEC_FIELD = 0;
private static final int KERNEL_TIMESPEC_TV_NSEC_FIELD = 8;
private final ThreadAwareExecutor executor;
IoUringIoHandler(ThreadAwareExecutor executor, IoUringIoHandlerConfig config) {
// Ensure that we load all native bits as otherwise it may fail when try to use native methods in IovArray
IoUring.ensureAvailability();
this.executor = requireNonNull(executor, "executor");
requireNonNull(config, "config");
int setupFlags = Native.setupFlags(config.singleIssuer());
//The default cq size is always twice the ringSize.
// It only makes sense when the user actually specifies the cq ring size.
int cqSize = 2 * config.getRingSize();
if (config.needSetupCqeSize()) {
assert IoUring.isSetupCqeSizeSupported();
setupFlags |= Native.IORING_SETUP_CQSIZE;
cqSize = config.getCqSize();
}
this.ringBuffer = Native.createRingBuffer(config.getRingSize(), cqSize, setupFlags);
if (IoUring.isRegisterIowqMaxWorkersSupported() && config.needRegisterIowqMaxWorker()) {
int maxBoundedWorker = Math.max(config.getMaxBoundedWorker(), 0);
int maxUnboundedWorker = Math.max(config.getMaxUnboundedWorker(), 0);
int result = Native.ioUringRegisterIoWqMaxWorkers(ringBuffer.fd(), maxBoundedWorker, maxUnboundedWorker);
if (result < 0) {
// Close ringBuffer before throwing to ensure we release all memory on failure.
ringBuffer.close();
throw new UncheckedIOException(Errors.newIOException("io_uring_register", result));
}
}
registeredIoUringBufferRing = new IntObjectHashMap<>();
Collection<IoUringBufferRingConfig> bufferRingConfigs = config.getInternBufferRingConfigs();
if (bufferRingConfigs != null && !bufferRingConfigs.isEmpty()) {
for (IoUringBufferRingConfig bufferRingConfig : bufferRingConfigs) {
try {
IoUringBufferRing ring = newBufferRing(ringBuffer.fd(), bufferRingConfig);
registeredIoUringBufferRing.put(bufferRingConfig.bufferGroupId(), ring);
} catch (Errors.NativeIoException e) {
for (IoUringBufferRing bufferRing : registeredIoUringBufferRing.values()) {
bufferRing.close();
}
// Close ringBuffer before throwing to ensure we release all memory on failure.
ringBuffer.close();
throw new UncheckedIOException(e);
}
}
Source
Frequently Asked Questions
What is the IoUringIoHandler class?
IoUringIoHandler is a class in the netty codebase, defined in transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringIoHandler.java.
Where is IoUringIoHandler defined?
IoUringIoHandler is defined in transport-classes-io_uring/src/main/java/io/netty/channel/uring/IoUringIoHandler.java at line 53.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free