Home / Class/ IoUringIoHandler Class — netty Architecture

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);
                }
            }

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