/* * Decompiled with CFR 0.152. * * Could not load the following classes: * com.google.common.util.concurrent.ThreadFactoryBuilder * io.netty.channel.Channel * io.netty.channel.EventLoopGroup * io.netty.channel.IoHandlerFactory * io.netty.channel.MultiThreadIoEventLoopGroup * io.netty.channel.ServerChannel * io.netty.channel.epoll.Epoll * io.netty.channel.epoll.EpollIoHandler * io.netty.channel.epoll.EpollServerSocketChannel * io.netty.channel.epoll.EpollSocketChannel * io.netty.channel.kqueue.KQueue * io.netty.channel.kqueue.KQueueIoHandler * io.netty.channel.kqueue.KQueueServerSocketChannel * io.netty.channel.kqueue.KQueueSocketChannel * io.netty.channel.local.LocalChannel * io.netty.channel.local.LocalIoHandler * io.netty.channel.local.LocalServerChannel * io.netty.channel.nio.NioIoHandler * io.netty.channel.socket.nio.NioServerSocketChannel * io.netty.channel.socket.nio.NioSocketChannel * org.jspecify.annotations.Nullable */ package net.minecraft.server.network; import com.google.common.util.concurrent.ThreadFactoryBuilder; import io.netty.channel.Channel; import io.netty.channel.EventLoopGroup; import io.netty.channel.IoHandlerFactory; import io.netty.channel.MultiThreadIoEventLoopGroup; import io.netty.channel.ServerChannel; import io.netty.channel.epoll.Epoll; import io.netty.channel.epoll.EpollIoHandler; import io.netty.channel.epoll.EpollServerSocketChannel; import io.netty.channel.epoll.EpollSocketChannel; import io.netty.channel.kqueue.KQueue; import io.netty.channel.kqueue.KQueueIoHandler; import io.netty.channel.kqueue.KQueueServerSocketChannel; import io.netty.channel.kqueue.KQueueSocketChannel; import io.netty.channel.local.LocalChannel; import io.netty.channel.local.LocalIoHandler; import io.netty.channel.local.LocalServerChannel; import io.netty.channel.nio.NioIoHandler; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import java.util.concurrent.ThreadFactory; import org.jspecify.annotations.Nullable; public abstract class EventLoopGroupHolder { private static final EventLoopGroupHolder NIO = new EventLoopGroupHolder("NIO", NioSocketChannel.class, NioServerSocketChannel.class){ @Override protected IoHandlerFactory ioHandlerFactory() { return NioIoHandler.newFactory(); } }; private static final EventLoopGroupHolder EPOLL = new EventLoopGroupHolder("Epoll", EpollSocketChannel.class, EpollServerSocketChannel.class){ @Override protected IoHandlerFactory ioHandlerFactory() { return EpollIoHandler.newFactory(); } }; private static final EventLoopGroupHolder KQUEUE = new EventLoopGroupHolder("Kqueue", KQueueSocketChannel.class, KQueueServerSocketChannel.class){ @Override protected IoHandlerFactory ioHandlerFactory() { return KQueueIoHandler.newFactory(); } }; private static final EventLoopGroupHolder LOCAL = new EventLoopGroupHolder("Local", LocalChannel.class, LocalServerChannel.class){ @Override protected IoHandlerFactory ioHandlerFactory() { return LocalIoHandler.newFactory(); } }; private final String type; private final Class channelCls; private final Class serverChannelCls; private volatile @Nullable EventLoopGroup group; public static EventLoopGroupHolder remote(boolean allowNativeTransport) { if (allowNativeTransport) { if (KQueue.isAvailable()) { return KQUEUE; } if (Epoll.isAvailable()) { return EPOLL; } } return NIO; } public static EventLoopGroupHolder local() { return LOCAL; } private EventLoopGroupHolder(String type, Class channelCls, Class serverChannelCls) { this.type = type; this.channelCls = channelCls; this.serverChannelCls = serverChannelCls; } private ThreadFactory createThreadFactory() { return new ThreadFactoryBuilder().setNameFormat("Netty " + this.type + " IO #%d").setDaemon(true).build(); } protected abstract IoHandlerFactory ioHandlerFactory(); private EventLoopGroup createEventLoopGroup() { return new MultiThreadIoEventLoopGroup(this.createThreadFactory(), this.ioHandlerFactory()); } /* * WARNING - Removed try catching itself - possible behaviour change. */ public EventLoopGroup eventLoopGroup() { EventLoopGroup result = this.group; if (result == null) { EventLoopGroupHolder eventLoopGroupHolder = this; synchronized (eventLoopGroupHolder) { result = this.group; if (result == null) { this.group = result = this.createEventLoopGroup(); } } } return result; } public Class channelCls() { return this.channelCls; } public Class serverChannelCls() { return this.serverChannelCls; } }