Home / Class/ EpollIoHandler Class — netty Architecture

EpollIoHandler Class — netty Architecture

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

Entity Profile

Dependency Diagram

graph TD
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb["EpollIoHandler"]
  d4f478e3_4aea_ff0a_1e7e_41b7850e2278["EpollIoHandler.java"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|defined in| d4f478e3_4aea_ff0a_1e7e_41b7850e2278
  129bf5a8_f973_af96_d38d_d6f4c9e661df["IoHandlerFactory()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 129bf5a8_f973_af96_d38d_d6f4c9e661df
  40c77ccb_a5b7_aed0_8603_28bc38d7dc1d["EpollIoHandler()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 40c77ccb_a5b7_aed0_8603_28bc38d7dc1d
  d8d3c2a7_f51b_49e6_1baf_d44b8354406c["EpollIoHandle()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| d8d3c2a7_f51b_49e6_1baf_d44b8354406c
  120cbd66_613e_f44e_c089_5cdea71305fa["EpollIoOps()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 120cbd66_613e_f44e_c089_5cdea71305fa
  971d9f3b_e81e_dc5f_753e_454755fc5aec["openFileDescriptors()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 971d9f3b_e81e_dc5f_753e_454755fc5aec
  cf0e10de_7ce5_c698_1c75_d701a03a88b4["closeFileDescriptor()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| cf0e10de_7ce5_c698_1c75_d701a03a88b4
  4e253f99_0b70_4990_9891_90c4147a53a9["wakeup()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 4e253f99_0b70_4990_9891_90c4147a53a9
  2945722a_0956_8b5c_9537_41d244da461b["prepareToDestroy()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 2945722a_0956_8b5c_9537_41d244da461b
  7323df9d_1a41_df1a_e926_ae591195533e["destroy()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 7323df9d_1a41_df1a_e926_ae591195533e
  b76e719f_e7f5_86e3_46e6_fb56c280ea70["IoRegistration()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| b76e719f_e7f5_86e3_46e6_fb56c280ea70
  9c27f373_141e_1407_afc9_28c8ec5476de["isCompatible()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 9c27f373_141e_1407_afc9_28c8ec5476de
  37e56614_1fbd_9e4f_ced7_863897ee3e54["numRegisteredChannels()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| 37e56614_1fbd_9e4f_ced7_863897ee3e54
  c3134656_25c7_4977_bd10_7885be81e8e1["registeredChannelsList()"]
  e531fecb_b495_8b97_8d1b_49ff2b5ccdbb -->|method| c3134656_25c7_4977_bd10_7885be81e8e1

Relationship Graph

Source Code

transport-classes-epoll/src/main/java/io/netty/channel/epoll/EpollIoHandler.java lines 54–575

public class EpollIoHandler implements IoHandler {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(EpollIoHandler.class);
    private static final long EPOLL_WAIT_MILLIS_THRESHOLD =
            SystemPropertyUtil.getLong("io.netty.channel.epoll.epollWaitThreshold", 10);

    {
        Epoll.ensureAvailability();
    }

    // Pick a number that no task could have previously used.
    private long prevDeadlineNanos = NONE;
    private FileDescriptor epollFd;
    private FileDescriptor eventFd;
    private FileDescriptor timerFd;
    private final IntObjectMap<DefaultEpollIoRegistration> registrations = new IntObjectHashMap<>(4096);
    private final boolean allowGrowing;
    private final EpollEventArray events;
    private final NativeArrays nativeArrays;

    private final SelectStrategy selectStrategy;
    private final IntSupplier selectNowSupplier = new IntSupplier() {
        @Override
        public int get() throws Exception {
            return epollWaitNow();
        }
    };
    private final ThreadAwareExecutor executor;

    private static final long AWAKE = -1L;
    private static final long NONE = Long.MAX_VALUE;

    // nextWakeupNanos is:
    //    AWAKE            when EL is awake
    //    NONE             when EL is waiting with no wakeup scheduled
    //    other value T    when EL is waiting with wakeup scheduled at time T
    private final AtomicLong nextWakeupNanos = new AtomicLong(AWAKE);
    private boolean pendingWakeup;

    private int numChannels;

    // See https://man7.org/linux/man-pages/man2/timerfd_create.2.html.
    private static final long MAX_SCHEDULED_TIMERFD_NS = 999999999;

    /**
     * Returns a new {@link IoHandlerFactory} that creates {@link EpollIoHandler} instances.
     */
    public static IoHandlerFactory newFactory() {
        return newFactory(0, DefaultSelectStrategyFactory.INSTANCE);
    }

    /**
     * Returns a new {@link IoHandlerFactory} that creates {@link EpollIoHandler} instances.
     */
    public static IoHandlerFactory newFactory(final int maxEvents,
                                              final SelectStrategyFactory selectStrategyFactory) {
        Epoll.ensureAvailability();
        ObjectUtil.checkPositiveOrZero(maxEvents, "maxEvents");
        ObjectUtil.checkNotNull(selectStrategyFactory, "selectStrategyFactory");
        return new IoHandlerFactory() {
            @Override
            public IoHandler newHandler(ThreadAwareExecutor executor) {
                return new EpollIoHandler(executor, maxEvents, selectStrategyFactory.newSelectStrategy());
            }

            @Override
            public boolean isChangingThreadSupported() {
                return true;
            }
        };
    }

    // Package-private for testing
    EpollIoHandler(ThreadAwareExecutor executor, int maxEvents, SelectStrategy strategy) {
        this.executor = ObjectUtil.checkNotNull(executor, "executor");
        selectStrategy = ObjectUtil.checkNotNull(strategy, "strategy");
        if (maxEvents == 0) {
            allowGrowing = true;
            events = new EpollEventArray(4096);
        } else {
            allowGrowing = false;
            events = new EpollEventArray(maxEvents);

Frequently Asked Questions

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

Analyze Your Own Codebase

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

Try Supermodel Free