< prev index next > src/java.base/linux/classes/sun/nio/ch/DefaultPollerProvider.java
Print this page
* 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 {
- DefaultPollerProvider() { }
+ private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
- @Override
- Poller.Mode defaultPollerMode() {
- if (ContinuationSupport.isSupported()) {
- return Poller.Mode.VTHREAD_POLLERS;
+ 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 {
- return Poller.Mode.SYSTEM_THREADS;
+ 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(Poller.Mode mode) {
+ int defaultReadPollers() {
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);
- }
+ return switch (pollerMode()) {
+ case SYSTEM_THREADS -> Math.max(Integer.highestOneBit(ncpus / 4), 1);
+ case VTHREAD_POLLERS -> Math.min(Integer.highestOneBit(ncpus), 32);
+ default -> super.defaultReadPollers();
+ };
}
@Override
Poller readPoller(boolean subPoller) throws IOException {
- return new EPollPoller(subPoller, true);
+ 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 {
- return new EPollPoller(subPoller, false);
+ 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 >