< prev index next > src/java.base/linux/classes/sun/nio/ch/DefaultPollerProvider.java
Print this page
/**
* 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);
}
}
/**
* 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 >