# HG changeset patch # User redestad # Date 1476738709 -7200 # Mon Oct 17 23:11:49 2016 +0200 # Node ID 791b02895aa0da69821c790b755a77fba6e17d60 # Parent 103b120931a97f3532c92d02cfd1053f8311ca6d 8168073: Speed up URI creation during module bootstrap Reviewed-by: alanb, mchung, psandoz diff --git a/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java b/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java --- a/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java +++ b/src/java.base/share/classes/java/lang/module/SystemModuleFinder.java @@ -44,6 +44,8 @@ import jdk.internal.jimage.ImageLocation; import jdk.internal.jimage.ImageReader; import jdk.internal.jimage.ImageReaderFactory; +import jdk.internal.misc.JavaNetUriAccess; +import jdk.internal.misc.SharedSecrets; import jdk.internal.module.ModuleHashes; import jdk.internal.module.ModuleHashes.HashSupplier; import jdk.internal.module.SystemModules; @@ -71,6 +73,8 @@ // ImageReader used to access all modules in the image private static final ImageReader imageReader; + private static final JavaNetUriAccess jnua = SharedSecrets.getJavaNetUriAccess(); + // the set of modules in the run-time image private static final Set modules; @@ -166,7 +170,8 @@ HashSupplier hash) { String mn = md.name(); - URI uri = URI.create("jrt:/" + mn); + + URI uri = jnua.create("jrt", "/".concat(mn)); Supplier readerSupplier = new Supplier<>() { @Override diff --git a/src/java.base/share/classes/java/net/URI.java b/src/java.base/share/classes/java/net/URI.java --- a/src/java.base/share/classes/java/net/URI.java +++ b/src/java.base/share/classes/java/net/URI.java @@ -37,6 +37,9 @@ import java.nio.charset.CodingErrorAction; import java.nio.charset.CharacterCodingException; import java.text.Normalizer; +import jdk.internal.loader.URLClassPath; +import jdk.internal.misc.JavaNetUriAccess; +import jdk.internal.misc.SharedSecrets; import sun.nio.cs.ThreadLocalCoders; import java.lang.Character; // for javadoc @@ -820,6 +823,25 @@ } /** + * Constructs a simple URI consisting of only a scheme and a pre-validated + * path. Provides a fast-path for some internal cases. + */ + URI(String scheme, String path) { + assert validSchemeAndPath(scheme, path); + this.scheme = scheme; + this.path = path; + } + + private static boolean validSchemeAndPath(String scheme, String path) { + try { + URI u = new URI(scheme + ":" + path); + return scheme.equals(u.scheme) && path.equals(u.path); + } catch (URISyntaxException e) { + return false; + } + } + + /** * Creates a URI by parsing the given string. * *

This convenience factory method works as if by invoking the {@link @@ -3571,5 +3593,13 @@ } } - + static { + SharedSecrets.setJavaNetUriAccess( + new JavaNetUriAccess() { + public URI create(String scheme, String path) { + return new URI(scheme, path); + } + } + ); + } } diff --git a/src/java.base/share/classes/java/net/URLClassLoader.java b/src/java.base/share/classes/java/net/URLClassLoader.java --- a/src/java.base/share/classes/java/net/URLClassLoader.java +++ b/src/java.base/share/classes/java/net/URLClassLoader.java @@ -51,8 +51,6 @@ import jdk.internal.loader.Resource; import jdk.internal.loader.URLClassPath; -import jdk.internal.misc.JavaNetAccess; -import jdk.internal.misc.SharedSecrets; import jdk.internal.perf.PerfCounter; import sun.net.www.ParseUtil; import sun.security.util.SecurityConstants; @@ -767,13 +765,6 @@ } static { - SharedSecrets.setJavaNetAccess( - new JavaNetAccess() { - public URLClassPath getURLClassPath(URLClassLoader u) { - return u.ucp; - } - } - ); ClassLoader.registerAsParallelCapable(); } } diff --git a/src/java.base/share/classes/jdk/internal/misc/JavaNetAccess.java b/src/java.base/share/classes/jdk/internal/misc/JavaNetUriAccess.java rename from src/java.base/share/classes/jdk/internal/misc/JavaNetAccess.java rename to src/java.base/share/classes/jdk/internal/misc/JavaNetUriAccess.java --- a/src/java.base/share/classes/jdk/internal/misc/JavaNetAccess.java +++ b/src/java.base/share/classes/jdk/internal/misc/JavaNetUriAccess.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,11 @@ package jdk.internal.misc; -import java.net.URLClassLoader; -import jdk.internal.loader.URLClassPath; +import java.net.URI; -public interface JavaNetAccess { +public interface JavaNetUriAccess { /** - * return the URLClassPath belonging to the given loader + * Create a URI of pre-validated scheme and path. */ - URLClassPath getURLClassPath (URLClassLoader u); + URI create(String scheme, String path); } diff --git a/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java b/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java --- a/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java +++ b/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java @@ -53,10 +53,10 @@ private static JavaLangInvokeAccess javaLangInvokeAccess; private static JavaLangRefAccess javaLangRefAccess; private static JavaIOAccess javaIOAccess; - private static JavaNetAccess javaNetAccess; private static JavaNetInetAddressAccess javaNetInetAddressAccess; private static JavaNetHttpCookieAccess javaNetHttpCookieAccess; private static JavaNetSocketAccess javaNetSocketAccess; + private static JavaNetUriAccess javaNetUriAccess; private static JavaNioAccess javaNioAccess; private static JavaIOFileDescriptorAccess javaIOFileDescriptorAccess; private static JavaIOFilePermissionAccess javaIOFilePermissionAccess; @@ -134,14 +134,14 @@ return javaLangRefAccess; } - public static void setJavaNetAccess(JavaNetAccess jna) { - javaNetAccess = jna; + public static void setJavaNetUriAccess(JavaNetUriAccess jnua) { + javaNetUriAccess = jnua; } - public static JavaNetAccess getJavaNetAccess() { - if (javaNetAccess == null) - unsafe.ensureClassInitialized(java.net.URLClassLoader.class); - return javaNetAccess; + public static JavaNetUriAccess getJavaNetUriAccess() { + if (javaNetUriAccess == null) + unsafe.ensureClassInitialized(java.net.URI.class); + return javaNetUriAccess; } public static void setJavaNetInetAddressAccess(JavaNetInetAddressAccess jna) {