# HG changeset patch # User redestad # Date 1535112274 -7200 # Node ID edcf0d52765889a9aa1421b7988d8dc5bd0d9f9e # Parent 7c3891b9f1e00e9d80ebedd0b5a410fbbb6f9551 8209837: Avoid initializing ExpiringCache during bootstrap Reviewed-by: sundar, forax diff -r 7c3891b9f1e0 -r edcf0d527658 src/java.base/share/classes/java/io/FileSystem.java --- a/src/java.base/share/classes/java/io/FileSystem.java Fri Jul 06 16:04:19 2018 +0200 +++ b/src/java.base/share/classes/java/io/FileSystem.java Fri Aug 24 14:04:34 2018 +0200 @@ -231,18 +231,16 @@ // Flags for enabling/disabling performance optimizations for file // name canonicalization - static boolean useCanonCaches; - static boolean useCanonPrefixCache; + static final boolean useCanonCaches; + static final boolean useCanonPrefixCache; private static boolean getBooleanProperty(String prop, boolean defaultVal) { - return Boolean.parseBoolean(System.getProperty(prop, - String.valueOf(defaultVal))); + String value = System.getProperty(prop); + return (value != null) ? Boolean.parseBoolean(value) : defaultVal; } static { - useCanonCaches = getBooleanProperty("sun.io.useCanonCaches", - useCanonCaches); - useCanonPrefixCache = getBooleanProperty("sun.io.useCanonPrefixCache", - useCanonPrefixCache); + useCanonCaches = getBooleanProperty("sun.io.useCanonCaches", false); + useCanonPrefixCache = useCanonCaches && getBooleanProperty("sun.io.useCanonPrefixCache", false); } } diff -r 7c3891b9f1e0 -r edcf0d527658 src/java.base/unix/classes/java/io/UnixFileSystem.java --- a/src/java.base/unix/classes/java/io/UnixFileSystem.java Fri Jul 06 16:04:19 2018 +0200 +++ b/src/java.base/unix/classes/java/io/UnixFileSystem.java Fri Aug 24 14:04:34 2018 +0200 @@ -44,6 +44,8 @@ colon = props.getProperty("path.separator").charAt(0); javaHome = StaticProperty.javaHome(); userDir = StaticProperty.userDir(); + cache = useCanonCaches ? new ExpiringCache() : null; + javaHomePrefixCache = useCanonPrefixCache ? new ExpiringCache() : null; } @@ -145,11 +147,11 @@ // same directory, and must not create results differing from the true // canonicalization algorithm in canonicalize_md.c. For this reason the // prefix cache is conservative and is not used for complex path names. - private ExpiringCache cache = new ExpiringCache(); + private final ExpiringCache cache; // On Unix symlinks can jump anywhere in the file system, so we only // treat prefixes in java.home as trusted and cacheable in the // canonicalization algorithm - private ExpiringCache javaHomePrefixCache = new ExpiringCache(); + private final ExpiringCache javaHomePrefixCache; public String canonicalize(String path) throws IOException { if (!useCanonCaches) { @@ -158,7 +160,7 @@ String res = cache.get(path); if (res == null) { String dir = null; - String resDir = null; + String resDir; if (useCanonPrefixCache) { // Note that this can cause symlinks that should // be resolved to a destination directory to be @@ -266,8 +268,12 @@ // (i.e., only remove/update affected entries) but probably // not worth it since these entries expire after 30 seconds // anyway. - cache.clear(); - javaHomePrefixCache.clear(); + if (useCanonCaches) { + cache.clear(); + } + if (useCanonPrefixCache) { + javaHomePrefixCache.clear(); + } return delete0(f); } private native boolean delete0(File f); @@ -279,8 +285,12 @@ // (i.e., only remove/update affected entries) but probably // not worth it since these entries expire after 30 seconds // anyway. - cache.clear(); - javaHomePrefixCache.clear(); + if (useCanonCaches) { + cache.clear(); + } + if (useCanonPrefixCache) { + javaHomePrefixCache.clear(); + } return rename0(f1, f2); } private native boolean rename0(File f1, File f2); diff -r 7c3891b9f1e0 -r edcf0d527658 src/java.base/windows/classes/java/io/WinNTFileSystem.java --- a/src/java.base/windows/classes/java/io/WinNTFileSystem.java Fri Jul 06 16:04:19 2018 +0200 +++ b/src/java.base/windows/classes/java/io/WinNTFileSystem.java Fri Aug 24 14:04:34 2018 +0200 @@ -51,6 +51,8 @@ semicolon = props.getProperty("path.separator").charAt(0); altSlash = (this.slash == '\\') ? '/' : '\\'; userDir = normalize(props.getProperty("user.dir")); + cache = useCanonCaches ? new ExpiringCache() : null; + prefixCache = useCanonPrefixCache ? new ExpiringCache() : null; } private boolean isSlash(char c) { @@ -387,8 +389,8 @@ // same directory, and must not create results differing from the true // canonicalization algorithm in canonicalize_md.c. For this reason the // prefix cache is conservative and is not used for complex path names. - private ExpiringCache cache = new ExpiringCache(); - private ExpiringCache prefixCache = new ExpiringCache(); + private final ExpiringCache cache; + private final ExpiringCache prefixCache; @Override public String canonicalize(String path) throws IOException { @@ -568,8 +570,12 @@ // (i.e., only remove/update affected entries) but probably // not worth it since these entries expire after 30 seconds // anyway. - cache.clear(); - prefixCache.clear(); + if (useCanonCaches) { + cache.clear(); + } + if (useCanonPrefixCache) { + prefixCache.clear(); + } return delete0(f); } @@ -582,8 +588,12 @@ // (i.e., only remove/update affected entries) but probably // not worth it since these entries expire after 30 seconds // anyway. - cache.clear(); - prefixCache.clear(); + if (useCanonCaches) { + cache.clear(); + } + if (useCanonPrefixCache) { + prefixCache.clear(); + } return rename0(f1, f2); }