< prev index next >

src/java.base/linux/classes/sun/nio/ch/DefaultPollerProvider.java

Print this page
*** 29,36 ***
  
  /**
   * Default PollerProvider for Linux.
   */
  class DefaultPollerProvider extends PollerProvider {
      DefaultPollerProvider() { }
  
      @Override
      Poller.Mode defaultPollerMode() {
          if (ContinuationSupport.isSupported()) {
!             return Poller.Mode.VTHREAD_POLLERS;
          } else {
              return Poller.Mode.SYSTEM_THREADS;
          }
      }
  
      @Override
      int defaultReadPollers(Poller.Mode mode) {
          int ncpus = Runtime.getRuntime().availableProcessors();
!         if (mode == Poller.Mode.VTHREAD_POLLERS) {
!             return Math.min(Integer.highestOneBit(ncpus), 32);
!         } else {
!             return Math.max(Integer.highestOneBit(ncpus / 4), 1);
!         }
      }
  
      @Override
      Poller readPoller(boolean subPoller) throws IOException {
!         return new EPollPoller(subPoller, true);
      }
  
      @Override
      Poller writePoller(boolean subPoller) throws IOException {
!         return new EPollPoller(subPoller, false);
      }
  }
--- 29,50 ---
  
  /**
   * Default PollerProvider for Linux.
   */
  class DefaultPollerProvider extends PollerProvider {
+     private static final boolean USE_IOURING;
+     static {
+         String s = System.getProperty("jdk.io_uring");
+         USE_IOURING = "".equals(s) || Boolean.parseBoolean(s);
+     }
+ 
      DefaultPollerProvider() { }
  
      @Override
      Poller.Mode defaultPollerMode() {
          if (ContinuationSupport.isSupported()) {
!             return USE_IOURING ? Poller.Mode.PER_CARRIER : Poller.Mode.VTHREAD_POLLERS;
          } else {
              return Poller.Mode.SYSTEM_THREADS;
          }
      }
  
      @Override
      int defaultReadPollers(Poller.Mode mode) {
          int ncpus = Runtime.getRuntime().availableProcessors();
!         return switch (mode) {
!             case SYSTEM_THREADS  -> Math.max(Integer.highestOneBit(ncpus / 4), 1);
!             case VTHREAD_POLLERS -> Math.min(Integer.highestOneBit(ncpus), 32);
!             default              -> super.defaultReadPollers(mode);
!         };
      }
  
      @Override
      Poller readPoller(boolean subPoller) throws IOException {
!         if (USE_IOURING) {
+             return new IoUringPoller(subPoller, true);
+         } else {
+             return new EPollPoller(subPoller, true);
+         }
      }
  
      @Override
      Poller writePoller(boolean subPoller) throws IOException {
!         if (USE_IOURING) {
+             return new IoUringPoller(subPoller, false);
+         } else {
+             return new EPollPoller(subPoller, false);
+         }
      }
  }
< prev index next >