< prev index next >

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

Print this page
*** 23,25 ***
   * questions.
   */
  package sun.nio.ch;
  
  import java.io.IOException;
  import jdk.internal.vm.ContinuationSupport;
  
  /**
   * Default PollerProvider for Linux.
   */
  class DefaultPollerProvider extends PollerProvider {
      DefaultPollerProvider(Poller.Mode mode) {
          super(mode);
      }
  
      DefaultPollerProvider() {
!         var mode = ContinuationSupport.isSupported()
!                 ? Poller.Mode.VTHREAD_POLLERS
!                 : Poller.Mode.SYSTEM_THREADS;
-         this(mode);
      }
  
      @Override
      int defaultReadPollers() {
          int ncpus = Runtime.getRuntime().availableProcessors();
--- 23,46 ---
   * questions.
   */
  package sun.nio.ch;
  
  import java.io.IOException;
+ import jdk.internal.access.JavaLangAccess;
+ import jdk.internal.access.SharedSecrets;
  import jdk.internal.vm.ContinuationSupport;
  
  /**
   * Default PollerProvider for Linux.
   */
  class DefaultPollerProvider extends PollerProvider {
+     private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
+ 
+     private static final boolean USE_IOURING;
+     private static final boolean USE_IORING_OP_READ;
+     private static final boolean USE_IORING_OP_WRITE;
+     static {
+         String s = System.getProperty("jdk.io_uring");
+         if ("".equals(s) || Boolean.parseBoolean(s)) {
+             USE_IOURING = true;
+             s = System.getProperty("jdk.io_uring.read");
+             USE_IORING_OP_READ = "".equals(s) || Boolean.parseBoolean(s);
+             s = System.getProperty("jdk.io_uring.write");
+             USE_IORING_OP_WRITE = "".equals(s) || Boolean.parseBoolean(s);
+         } else {
+             USE_IOURING = false;
+             USE_IORING_OP_READ = false;
+             USE_IORING_OP_WRITE = false;
+         }
+     }
+ 
      DefaultPollerProvider(Poller.Mode mode) {
          super(mode);
      }
  
      DefaultPollerProvider() {
!         boolean usingBuiltinScheduler = ContinuationSupport.isSupported()
!                 && (JLA.defaultVirtualThreadScheduler() == JLA.builtinVirtualThreadScheduler());
!         this(usingBuiltinScheduler ? Poller.Mode.VTHREAD_POLLERS : Poller.Mode.SYSTEM_THREADS);
      }
  
      @Override
      int defaultReadPollers() {
          int ncpus = Runtime.getRuntime().availableProcessors();

*** 52,13 ***
          };
      }
  
      @Override
      Poller readPoller(boolean subPoller) throws IOException {
!         return new EPollPoller(pollerMode(), subPoller, true);
      }
  
      @Override
      Poller writePoller(boolean subPoller) throws IOException {
!         return new EPollPoller(pollerMode(), subPoller, false);
      }
  }
--- 73,39 ---
          };
      }
  
      @Override
      Poller readPoller(boolean subPoller) throws IOException {
!         Poller.Mode mode = pollerMode();
+         if (USE_IOURING) {
+             // read poller is system thread in SYSTEM_THREADS mode
+             boolean supportReadOps = USE_IORING_OP_READ
+                     && ((mode == Poller.Mode.SYSTEM_THREADS) || subPoller);
+             return new IoUringPoller(mode, subPoller, true, supportReadOps);
+         } else {
+             return new EPollPoller(mode, subPoller, true);
+         }
      }
  
      @Override
      Poller writePoller(boolean subPoller) throws IOException {
!         Poller.Mode mode = pollerMode();
+         if (USE_IOURING) {
+             // write poller is system thread in SYSTEM_THREADS and POLLER_PER_CARRIER modes
+             boolean supportWriteOps = USE_IORING_OP_WRITE
+                     && ((mode != Poller.Mode.VTHREAD_POLLERS) || subPoller);
+             return new IoUringPoller(mode, subPoller, false, supportWriteOps);
+         } else {
+             return new EPollPoller(mode, subPoller, false);
+         }
+     }
+ 
+     @Override
+     boolean supportReadOps() {
+         return USE_IORING_OP_READ;
+     }
+ 
+     @Override
+     boolean supportWriteOps() {
+         return USE_IORING_OP_WRITE;
      }
  }
< prev index next >