Improved NIO constraint level detection - should start up faster with Sun JVM
This commit is contained in:
parent
fd4de999bb
commit
93c1dd58ba
|
@ -28,6 +28,7 @@ import java.nio.channels.ClosedChannelException;
|
||||||
import java.nio.channels.SelectionKey;
|
import java.nio.channels.SelectionKey;
|
||||||
import java.nio.channels.Selector;
|
import java.nio.channels.Selector;
|
||||||
import java.nio.channels.ServerSocketChannel;
|
import java.nio.channels.ServerSocketChannel;
|
||||||
|
import java.nio.channels.spi.SelectorProvider;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
@ -35,6 +36,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jboss.netty.logging.InternalLogger;
|
import org.jboss.netty.logging.InternalLogger;
|
||||||
import org.jboss.netty.logging.InternalLoggerFactory;
|
import org.jboss.netty.logging.InternalLoggerFactory;
|
||||||
|
import org.jboss.netty.util.SystemPropertyUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides information which is specific to a NIO service provider
|
* Provides information which is specific to a NIO service provider
|
||||||
|
@ -65,7 +67,7 @@ class NioProviderMetadata {
|
||||||
|
|
||||||
// Use the system property if possible.
|
// Use the system property if possible.
|
||||||
try {
|
try {
|
||||||
String value = System.getProperty(CONSTRAINT_LEVEL_PROPERTY);
|
String value = SystemPropertyUtil.get(CONSTRAINT_LEVEL_PROPERTY, "-1");
|
||||||
constraintLevel = Integer.parseInt(value);
|
constraintLevel = Integer.parseInt(value);
|
||||||
if (constraintLevel < 0 || constraintLevel > 2) {
|
if (constraintLevel < 0 || constraintLevel > 2) {
|
||||||
constraintLevel = -1;
|
constraintLevel = -1;
|
||||||
|
@ -75,11 +77,18 @@ class NioProviderMetadata {
|
||||||
constraintLevel);
|
constraintLevel);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// format error or security issue
|
// format error
|
||||||
}
|
}
|
||||||
|
|
||||||
if (constraintLevel < 0) {
|
if (constraintLevel < 0) {
|
||||||
constraintLevel = detectConstraintLevel();
|
constraintLevel = detectConstraintLevelFromSystemProperties();
|
||||||
|
|
||||||
|
if (constraintLevel < 0) {
|
||||||
|
logger.debug(
|
||||||
|
"Couldn't get the NIO constraint level from the system properties.");
|
||||||
|
constraintLevel = detectConstraintLevel();
|
||||||
|
}
|
||||||
|
|
||||||
if (constraintLevel < 0) {
|
if (constraintLevel < 0) {
|
||||||
constraintLevel = 2;
|
constraintLevel = 2;
|
||||||
logger.warn(
|
logger.warn(
|
||||||
|
@ -106,6 +115,51 @@ class NioProviderMetadata {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int detectConstraintLevelFromSystemProperties() {
|
||||||
|
String os = SystemPropertyUtil.get("os.name");
|
||||||
|
String vendor = SystemPropertyUtil.get("java.vm.vendor");
|
||||||
|
String provider;
|
||||||
|
try {
|
||||||
|
provider = SelectorProvider.provider().getClass().getName();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Perhaps security exception.
|
||||||
|
provider = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (os == null || vendor == null || provider == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
os = os.toLowerCase();
|
||||||
|
vendor = vendor.toLowerCase();
|
||||||
|
|
||||||
|
// Sun JVM
|
||||||
|
if (vendor.indexOf("sun") >= 0) {
|
||||||
|
// Linux
|
||||||
|
if (os.indexOf("linux") >= 0) {
|
||||||
|
if (provider.equals("sun.nio.ch.EPollSelectorProvider") ||
|
||||||
|
provider.equals("sun.nio.ch.PollSelectorProvider")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Windows
|
||||||
|
} else if (os.indexOf("windows") >= 0) {
|
||||||
|
if (provider.equals("sun.nio.ch.DevPollSelectorProvider")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Solaris
|
||||||
|
} else if (os.indexOf("sunos") >= 0 || os.indexOf("solaris") >= 0) {
|
||||||
|
if (provider.equals("sun.nio.ch.WindowsSelectorProvider")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Others: IBM JRE - 1 or 2, JRockIt - untested
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
private static int detectConstraintLevel() {
|
private static int detectConstraintLevel() {
|
||||||
// TODO Code cleanup - what a mess.
|
// TODO Code cleanup - what a mess.
|
||||||
final int constraintLevel;
|
final int constraintLevel;
|
||||||
|
@ -152,7 +206,6 @@ class NioProviderMetadata {
|
||||||
executor.execute(loop);
|
executor.execute(loop);
|
||||||
|
|
||||||
// Level 0
|
// Level 0
|
||||||
// TODO Make it run faster
|
|
||||||
success = true;
|
success = true;
|
||||||
for (int i = 0; i < 10; i ++) {
|
for (int i = 0; i < 10; i ++) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user