All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.services.transport.rsocket.DelegatedLoopResources Maven / Gradle / Ivy

package io.scalecube.services.transport.rsocket;

import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.ServerChannel;
import io.netty.channel.epoll.EpollDatagramChannel;
import io.netty.channel.epoll.EpollServerSocketChannel;
import io.netty.channel.epoll.EpollSocketChannel;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.util.concurrent.atomic.AtomicBoolean;
import reactor.core.publisher.Mono;
import reactor.netty.resources.LoopResources;

/**
 * Loop resources implementation based on already constructed boss event loop group and worker event
 * loop group. This loop resources instance doesn't allocate any resources by itself.
 */
public class DelegatedLoopResources implements LoopResources {

  private final boolean preferEpoll;
  private final EventLoopGroup bossGroup;
  private final EventLoopGroup workerGroup;
  private final AtomicBoolean running = new AtomicBoolean(true);

  /**
   * Constructor for loop resources. Boss group will be null.
   *
   * @param preferEpoll should use epoll or nio
   * @param workerGroup worker event loop group
   */
  public DelegatedLoopResources(boolean preferEpoll, EventLoopGroup workerGroup) {
    this(preferEpoll, null, workerGroup);
  }

  /**
   * Constructor for loop resources.
   *
   * @param preferEpoll should use epoll or nio
   * @param bossGroup selector event loop group
   * @param workerGroup worker event loop group
   */
  public DelegatedLoopResources(
      boolean preferEpoll, EventLoopGroup bossGroup, EventLoopGroup workerGroup) {
    this.preferEpoll = preferEpoll;
    this.bossGroup = bossGroup;
    this.workerGroup = workerGroup;
  }

  @Override
  public EventLoopGroup onClient(boolean useNative) {
    return workerGroup;
  }

  @Override
  public EventLoopGroup onServer(boolean useNative) {
    return workerGroup;
  }

  @Override
  public EventLoopGroup onServerSelect(boolean useNative) {
    return bossGroup;
  }

  @Override
  public Class onChannel(EventLoopGroup group) {
    return preferEpoll ? EpollSocketChannel.class : NioSocketChannel.class;
  }

  @Override
  public Class onDatagramChannel(EventLoopGroup group) {
    return preferEpoll ? EpollDatagramChannel.class : NioDatagramChannel.class;
  }

  @Override
  public Class onServerChannel(EventLoopGroup group) {
    return preferEpoll ? EpollServerSocketChannel.class : NioServerSocketChannel.class;
  }

  @Override
  public boolean preferNative() {
    return preferEpoll;
  }

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

  @Override
  public void dispose() {
    // no-op
  }

  @Override
  public boolean isDisposed() {
    return !running.get();
  }

  @Override
  public Mono disposeLater() {
    return Mono.defer(
        () -> {
          running.compareAndSet(true, false);
          return Mono.empty();
        });
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy