--- a/.hgtags-top-repo Thu Dec 22 18:48:23 2016 +0000
+++ b/.hgtags-top-repo Wed Jul 05 22:38:24 2017 +0200
@@ -392,3 +392,4 @@
5f6920274c48eb00d31afee6c034826a754c13d9 jdk-9+147
3ffc3e886c74736e387f3685e86b557cdea706c8 jdk-9+148
b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149
+6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150
--- a/common/autoconf/boot-jdk.m4 Thu Dec 22 18:48:23 2016 +0000
+++ b/common/autoconf/boot-jdk.m4 Wed Jul 05 22:38:24 2017 +0200
@@ -305,9 +305,8 @@
BOOT_JDK_SOURCETARGET="-source 8 -target 8"
AC_SUBST(BOOT_JDK_SOURCETARGET)
- ADD_JVM_ARG_IF_OK([--patch-module foo=bar], dummy, [$JAVA])
AC_MSG_CHECKING([if Boot JDK supports modules])
- if test "x$JVM_ARG_OK" = "xtrue"; then
+ if "$JAVA" --list-modules > /dev/null 2>&1; then
AC_MSG_RESULT([yes])
BOOT_JDK_MODULAR="true"
else
--- a/common/autoconf/generated-configure.sh Thu Dec 22 18:48:23 2016 +0000
+++ b/common/autoconf/generated-configure.sh Wed Jul 05 22:38:24 2017 +0200
@@ -5170,7 +5170,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1482168759
+DATE_WHEN_GENERATED=1482828098
###############################################################################
#
@@ -24677,7 +24677,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_MINOR=0
+ VERSION_MINOR=$DEFAULT_VERSION_MINOR
fi
fi
@@ -24724,7 +24724,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_SECURITY=0
+ VERSION_SECURITY=$DEFAULT_VERSION_SECURITY
fi
fi
@@ -24771,7 +24771,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_PATCH=0
+ VERSION_PATCH=$DEFAULT_VERSION_PATCH
fi
fi
@@ -30665,24 +30665,9 @@
BOOT_JDK_SOURCETARGET="-source 8 -target 8"
-
- $ECHO "Check if jvm arg is ok: --patch-module foo=bar" >&5
- $ECHO "Command: $JAVA --patch-module foo=bar -version" >&5
- OUTPUT=`$JAVA --patch-module foo=bar -version 2>&1`
- FOUND_WARN=`$ECHO "$OUTPUT" | $GREP -i warn`
- FOUND_VERSION=`$ECHO $OUTPUT | $GREP " version \""`
- if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
- dummy="$dummy --patch-module foo=bar"
- JVM_ARG_OK=true
- else
- $ECHO "Arg failed:" >&5
- $ECHO "$OUTPUT" >&5
- JVM_ARG_OK=false
- fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Boot JDK supports modules" >&5
$as_echo_n "checking if Boot JDK supports modules... " >&6; }
- if test "x$JVM_ARG_OK" = "xtrue"; then
+ if "$JAVA" --list-modules > /dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
BOOT_JDK_MODULAR="true"
--- a/common/autoconf/hotspot.m4 Thu Dec 22 18:48:23 2016 +0000
+++ b/common/autoconf/hotspot.m4 Wed Jul 05 22:38:24 2017 +0200
@@ -481,7 +481,7 @@
AC_MSG_RESULT([no, forced])
BUILD_GTEST="false"
elif test "x$enable_hotspot_gtest" = "x"; then
- if test "x$GTEST_DIR_EXISTS" = "xtrue" && test "x$OPENJDK_TARGET_OS" != "xaix"; then
+ if test "x$GTEST_DIR_EXISTS" = "xtrue"; then
AC_MSG_RESULT([yes])
BUILD_GTEST="true"
else
--- a/common/autoconf/jdk-version.m4 Thu Dec 22 18:48:23 2016 +0000
+++ b/common/autoconf/jdk-version.m4 Wed Jul 05 22:38:24 2017 +0200
@@ -226,7 +226,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_MINOR=0
+ VERSION_MINOR=$DEFAULT_VERSION_MINOR
fi
fi
@@ -248,7 +248,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_SECURITY=0
+ VERSION_SECURITY=$DEFAULT_VERSION_SECURITY
fi
fi
@@ -270,7 +270,7 @@
else
if test "x$NO_DEFAULT_VERSION_PARTS" != xtrue; then
# Default is 0, if unspecified
- VERSION_PATCH=0
+ VERSION_PATCH=$DEFAULT_VERSION_PATCH
fi
fi
--- a/common/autoconf/version-numbers Thu Dec 22 18:48:23 2016 +0000
+++ b/common/autoconf/version-numbers Wed Jul 05 22:38:24 2017 +0200
@@ -26,6 +26,9 @@
# Default version numbers to use unless overridden by configure
DEFAULT_VERSION_MAJOR=9
+DEFAULT_VERSION_MINOR=0
+DEFAULT_VERSION_SECURITY=0
+DEFAULT_VERSION_PATCH=0
LAUNCHER_NAME=openjdk
PRODUCT_NAME=OpenJDK
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/common/bin/print-config.js Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This little utility can be used to expand the jib-profiles configuration
+ * files into plain json.
+ *
+ * Usage:
+ *
+ * jjs -scripting print-config.js -- [<jib-profiles.js>]
+ *
+ */
+
+var file = $ARG[0];
+if (file == null) {
+ file = new java.io.File(__DIR__, "../conf/jib-profiles.js").getCanonicalPath();
+}
+load(file);
+var input = {};
+input.get = function(dependencyName, attribute) {
+ return "\${" + dependencyName + "." + attribute + "}";
+};
+print(JSON.stringify(getJibProfiles(input), null, 2));
--- a/common/conf/jib-profiles.js Thu Dec 22 18:48:23 2016 +0000
+++ b/common/conf/jib-profiles.js Wed Jul 05 22:38:24 2017 +0200
@@ -55,6 +55,7 @@
* be provided:
*
* input.profile
+ * input.build_id
* input.target_os
* input.target_cpu
* input.build_os
@@ -181,11 +182,14 @@
var data = {};
- // Identifies the version of this format to the tool reading it
- data.format_version = "1.0";
+ // Identifies the version of this format to the tool reading it.
+ // 1.1 signifies that the publish, publish-src and get-src features are usable.
+ data.format_version = "1.1";
- // Organization is used when uploading/publishing build results
- data.organization = "com.oracle.jpg.jdk";
+ // Organization, product and version are used when uploading/publishing build results
+ data.organization = "";
+ data.product = "jdk";
+ data.version = getVersion();
// The base directory for the build output. JIB will assume that the
// actual build directory will be <output_basedir>/<configuration>
@@ -195,12 +199,18 @@
// The make argument to use to specify the name of the configuration
data.configuration_make_arg = "CONF_NAME=";
+ // Exclude list to use when Jib creates a source bundle
+ data.src_bundle_excludes = "./build webrev .hg */.hg */*/.hg */*/*/.hg";
+ // Include list to use when creating a minimal jib source bundle which
+ // contains just the jib configuration files.
+ data.conf_bundle_includes = "*/conf/jib-profiles.* common/autoconf/version-numbers"
+
// Define some common values
- var common = getJibProfilesCommon(input);
+ var common = getJibProfilesCommon(input, data);
// Generate the profiles part of the configuration
- data.profiles = getJibProfilesProfiles(input, common);
+ data.profiles = getJibProfilesProfiles(input, common, data);
// Generate the dependencies part of the configuration
- data.dependencies = getJibProfilesDependencies(input, common);
+ data.dependencies = getJibProfilesDependencies(input, common, data);
return data;
};
@@ -211,18 +221,168 @@
* @param input External data to use for generating the configuration
* @returns Common values
*/
-var getJibProfilesCommon = function (input) {
+var getJibProfilesCommon = function (input, data) {
var common = {};
- common.dependencies = ["boot_jdk", "gnumake", "jtreg"],
- common.default_make_targets = ["product-bundles", "test-bundles"],
- common.default_make_targets_debug = common.default_make_targets;
- common.default_make_targets_slowdebug = common.default_make_targets;
- common.configure_args = ["--enable-jtreg-failure-handler"],
- common.configure_args_32bit = ["--with-target-bits=32"],
- common.configure_args_debug = ["--enable-debug"],
- common.configure_args_slowdebug = ["--with-debug-level=slowdebug"],
- common.organization = "jpg.infra.builddeps"
+ common.organization = "jpg.infra.builddeps";
+ common.build_id = getBuildId(input);
+ common.build_number = input.build_number != null ? input.build_number : "0";
+
+ // List of the main profile names used for iteration
+ common.main_profile_names = [
+ "linux-x64", "linux-x86", "macosx-x64", "solaris-x64",
+ "solaris-sparcv9", "windows-x64", "windows-x86"
+ ];
+
+ // These are the base setttings for all the main build profiles.
+ common.main_profile_base = {
+ dependencies: ["boot_jdk", "gnumake", "jtreg"],
+ default_make_targets: ["product-bundles", "test-bundles"],
+ configure_args: [
+ "--with-version-opt=" + common.build_id,
+ "--enable-jtreg-failure-handler",
+ "--with-version-build=" + common.build_number
+ ]
+ };
+ // Extra settings for debug profiles
+ common.debug_suffix = "-debug";
+ common.debug_profile_base = {
+ configure_args: ["--enable-debug"],
+ labels: "debug"
+ };
+ // Extra settings for slowdebug profiles
+ common.slowdebug_suffix = "-slowdebug";
+ common.slowdebug_profile_base = {
+ configure_args: ["--with-debug-level=slowdebug"],
+ labels: "slowdebug"
+ };
+ // Extra settings for openjdk only profiles
+ common.open_suffix = "-open";
+ common.open_profile_base = {
+ configure_args: ["--enable-openjdk-only"],
+ labels: "open"
+ };
+
+ common.configure_args_32bit = ["--with-target-bits=32"];
+
+ /**
+ * Define common artifacts template for all main profiles
+ * @param pf - Name of platform in bundle names
+ * @param demo_ext - Type of extension for demo bundle
+ */
+ common.main_profile_artifacts = function (pf, demo_ext) {
+ return {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ exploded: "images/test"
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo." + demo_ext + "\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_demo." + demo_ext,
+ "bundles/" + pf + "/\\1"
+ ],
+ }
+ }
+ };
+ };
+
+
+ /**
+ * Define common artifacts template for all debug profiles
+ * @param pf - Name of platform in bundle names
+ */
+ common.debug_profile_artifacts = function (pf) {
+ return {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests-debug.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-tests-debug.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ exploded: "images/test"
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jdk-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jdk-" + data.version,
+ exploded: "images/jdk"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-debug-symbols.tar.gz\\)",
+ remote: [
+ "bundles/" + pf + "/jre-" + data.version + "_" + pf + "_bin-debug-symbols.tar.gz",
+ "bundles/" + pf + "/\\1"
+ ],
+ subdir: "jre-" + data.version,
+ exploded: "images/jre"
+ }
+ }
+ };
+ };
var boot_jdk_revision = "8";
var boot_jdk_subdirpart = "1.8.0";
@@ -251,100 +411,105 @@
* @param common The common values
* @returns {{}} Profiles part of the configuration
*/
-var getJibProfilesProfiles = function (input, common) {
- var profiles = {};
-
+var getJibProfilesProfiles = function (input, common, data) {
// Main SE profiles
- var mainProfiles = {
+ var profiles = {
"linux-x64": {
target_os: "linux",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, "--with-zlib=system"),
- default_make_targets: concat(common.default_make_targets, "docs-bundles")
+ dependencies: ["devkit"],
+ configure_args: ["--with-zlib=system"],
+ default_make_targets: ["docs-bundles"],
},
"linux-x86": {
target_os: "linux",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, common.configure_args_32bit,
+ dependencies: ["devkit"],
+ configure_args: concat(common.configure_args_32bit,
"--with-jvm-variants=minimal,server", "--with-zlib=system"),
- default_make_targets: common.default_make_targets
},
"macosx-x64": {
target_os: "macosx",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
+ dependencies: ["devkit"],
configure_args: concat(common.configure_args, "--with-zlib=system"),
- default_make_targets: common.default_make_targets
},
"solaris-x64": {
target_os: "solaris",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "cups"),
- configure_args: concat(common.configure_args, "--with-zlib=system",
- "--enable-dtrace"),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "cups"],
+ configure_args: ["--with-zlib=system", "--enable-dtrace"],
},
"solaris-sparcv9": {
target_os: "solaris",
target_cpu: "sparcv9",
- dependencies: concat(common.dependencies, "devkit", "cups"),
- configure_args: concat(common.configure_args, "--with-zlib=system",
- "--enable-dtrace"),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "cups"],
+ configure_args: ["--with-zlib=system", "--enable-dtrace"],
},
"windows-x64": {
target_os: "windows",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "freetype"),
- configure_args: concat(common.configure_args),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "freetype"],
},
"windows-x86": {
target_os: "windows",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit", "freetype"),
- configure_args: concat(common.configure_args, common.configure_args_32bit),
- default_make_targets: common.default_make_targets
+ dependencies: ["devkit", "freetype"],
+ configure_args: concat(common.configure_args_32bit),
}
};
- profiles = concatObjects(profiles, mainProfiles);
+ // Add the base settings to all the main profiles
+ common.main_profile_names.forEach(function (name) {
+ profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
+ });
+
// Generate debug versions of all the main profiles
- profiles = concatObjects(profiles, generateDebugProfiles(common, mainProfiles));
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[debugName] = concatObjects(profiles[name],
+ common.debug_profile_base);
+ });
// Generate slowdebug versions of all the main profiles
- profiles = concatObjects(profiles, generateSlowdebugProfiles(common, mainProfiles));
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.slowdebug_suffix;
+ profiles[debugName] = concatObjects(profiles[name],
+ common.slowdebug_profile_base);
+ });
// Generate open only profiles for all the main profiles for JPRT and reference
// implementation builds.
- var openOnlyProfiles = generateOpenOnlyProfiles(common, mainProfiles);
+ common.main_profile_names.forEach(function (name) {
+ var openName = name + common.open_suffix;
+ profiles[openName] = concatObjects(profiles[name],
+ common.open_profile_base);
+ });
// The open only profiles on linux are used for reference builds and should
// produce the compact profile images by default. This adds "profiles" as an
// extra default target.
var openOnlyProfilesExtra = {
- "linux-x64-open": {
- default_make_targets: "profiles"
- },
-
"linux-x86-open": {
default_make_targets: "profiles",
configure_args: "--with-jvm-variants=client,server"
}
};
- var openOnlyProfiles = concatObjects(openOnlyProfiles, openOnlyProfilesExtra);
+ profiles = concatObjects(profiles, openOnlyProfilesExtra);
- profiles = concatObjects(profiles, openOnlyProfiles);
- // Generate debug profiles for the open jprt profiles
- profiles = concatObjects(profiles, generateDebugProfiles(common, openOnlyProfiles));
+ // Generate debug profiles for the open only profiles
+ common.main_profile_names.forEach(function (name) {
+ var openName = name + common.open_suffix;
+ var openDebugName = openName + common.debug_suffix;
+ profiles[openDebugName] = concatObjects(profiles[openName],
+ common.debug_profile_base);
+ });
// Profiles for building the zero jvm variant. These are used for verification
// in JPRT.
@@ -352,31 +517,46 @@
"linux-x64-zero": {
target_os: "linux",
target_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args,
+ dependencies: ["devkit"],
+ configure_args: [
"--with-zlib=system",
"--with-jvm-variants=zero",
- "--enable-libffi-bundling"),
- default_make_targets: common.default_make_targets
+ "--enable-libffi-bundling"
+ ]
},
"linux-x86-zero": {
target_os: "linux",
target_cpu: "x86",
build_cpu: "x64",
- dependencies: concat(common.dependencies, "devkit"),
- configure_args: concat(common.configure_args, common.configure_args_32bit,
+ dependencies: ["devkit"],
+ configure_args: concat(common.configure_args_32bit, [
"--with-zlib=system",
"--with-jvm-variants=zero",
- "--enable-libffi-bundling"),
- default_make_targets: common.default_make_targets
- },
+ "--enable-libffi-bundling"
+ ])
+ }
}
profiles = concatObjects(profiles, zeroProfiles);
- profiles = concatObjects(profiles, generateDebugProfiles(common, zeroProfiles));
+
+ // Add the base settings to the zero profiles and generate debug profiles
+ Object.keys(zeroProfiles).forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[name] = concatObjects(common.main_profile_base, profiles[name]);
+ profiles[debugName] = concatObjects(profiles[name], common.debug_profile_base);
+ });
- // Profiles used to run tests. Used in JPRT.
+ // Profiles used to run tests. Used in JPRT and Mach 5.
var testOnlyProfiles = {
+ "run-test-jprt": {
+ target_os: input.build_os,
+ target_cpu: input.build_cpu,
+ dependencies: [ "jtreg", "gnumake", "boot_jdk" ],
+ labels: "test",
+ environment: {
+ "JT_JAVA": common.boot_jdk_home
+ }
+ },
"run-test": {
target_os: input.build_os,
@@ -390,6 +570,230 @@
};
profiles = concatObjects(profiles, testOnlyProfiles);
+ // Profiles used to run tests using Jib for internal dependencies.
+ var testedProfile = input.testedProfile;
+ if (testedProfile == null) {
+ testedProfile = input.build_os + "-" + input.build_cpu;
+ }
+ var testOnlyProfilesPrebuilt = {
+ "run-test-prebuilt": {
+ src: "src.conf",
+ dependencies: [ "jtreg", "gnumake", testedProfile + ".jdk",
+ testedProfile + ".test", "src.full"
+ ],
+ work_dir: input.get("src.full", "install_path") + "/test",
+ environment: {
+ "PRODUCT_HOME": input.get(testedProfile + ".jdk", "home_path"),
+ "TEST_IMAGE_DIR": input.get(testedProfile + ".test", "home_path"),
+ "TEST_OUTPUT_DIR": input.src_top_dir
+ },
+ labels: "test"
+ }
+ };
+ // If actually running the run-test-prebuilt profile, verify that the input
+ // variable is valid and if so, add the appropriate target_* values from
+ // the tested profile.
+ if (input.profile == "run-test-prebuilt") {
+ if (profiles[testedProfile] == null) {
+ error("testedProfile is not defined: " + testedProfile);
+ } else {
+ testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_os"]
+ = profiles[testedProfile]["target_os"];
+ testOnlyProfilesPrebuilt["run-test-prebuilt"]["target_cpu"]
+ = profiles[testedProfile]["target_cpu"];
+ }
+ }
+ profiles = concatObjects(profiles, testOnlyProfilesPrebuilt);
+
+ //
+ // Define artifacts for profiles
+ //
+ // Macosx bundles are named osx and Windows demo bundles use zip instead of
+ // tar.gz.
+ var artifactData = {
+ "linux-x64": {
+ platform: "linux-x64",
+ demo_ext: "tar.gz"
+ },
+ "linux-x86": {
+ platform: "linux-x86",
+ demo_ext: "tar.gz"
+ },
+ "macosx-x64": {
+ platform: "osx-x64",
+ demo_ext: "tar.gz"
+ },
+ "solaris-x64": {
+ platform: "solaris-x64",
+ demo_ext: "tar.gz"
+ },
+ "solaris-sparcv9": {
+ platform: "solaris-sparcv9",
+ demo_ext: "tar.gz"
+ },
+ "windows-x64": {
+ platform: "windows-x64",
+ demo_ext: "zip"
+ },
+ "windows-x86": {
+ platform: "windows-x86",
+ demo_ext: "zip"
+ }
+ }
+ // Generate common artifacts for all main profiles
+ common.main_profile_names.forEach(function (name) {
+ profiles[name] = concatObjects(profiles[name],
+ common.main_profile_artifacts(artifactData[name].platform, artifactData[name].demo_ext));
+ });
+
+ // Generate common artifacts for all debug profiles
+ common.main_profile_names.forEach(function (name) {
+ var debugName = name + common.debug_suffix;
+ profiles[debugName] = concatObjects(profiles[debugName],
+ common.debug_profile_artifacts(artifactData[name].platform));
+ });
+
+ // Extra profile specific artifacts
+ profilesArtifacts = {
+ "linux-x64": {
+ artifacts: {
+ doc_api_spec: {
+ local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)",
+ remote: [
+ "bundles/common/jdk-" + data.version + "_doc-api-spec.tar.gz",
+ "bundles/linux-x64/\\1"
+ ],
+ },
+ }
+ },
+
+ "linux-x64-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ doc_api_spec: {
+ local: "bundles/\\(jdk.*doc-api-spec.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/linux-x64/\\1",
+ },
+ }
+ },
+
+ "linux-x86-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*[0-9]_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },/* The build does not create these
+ jre_compact1: {
+ local: "bundles/\\(jre.*-compact1_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre_compact2: {
+ local: "bundles/\\(jre.*-compact2_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre_compact3: {
+ local: "bundles/\\(jre.*-compact3_linux-x86_bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },*/
+ }
+ },
+
+ "windows-x86-open": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1"
+ },
+ test: {
+ local: "bundles/\\(jdk.*bin-tests.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1"
+ },
+ jre_symbols: {
+ local: "bundles/\\(jre.*bin-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ },
+ demo: {
+ local: "bundles/\\(jdk.*demo.zip\\)",
+ remote: "bundles/openjdk/GPL/windows-x86/\\1",
+ }
+ }
+ },
+
+ "linux-x86-open-debug": {
+ artifacts: {
+ jdk: {
+ local: "bundles/\\(jdk.*bin-debug.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jre: {
+ local: "bundles/\\(jre.*bin-debug.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ jdk_symbols: {
+ local: "bundles/\\(jdk.*bin-debug-symbols.tar.gz\\)",
+ remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
+ },
+ }
+ },
+
+ };
+ profiles = concatObjects(profiles, profilesArtifacts);
+
+
+ // Define the reference implementation profiles. These are basically the same
+ // as the open profiles, but upload artifacts to a different location and
+ // are only defined for specific platforms.
+ profiles["linux-x64-ri"] = clone(profiles["linux-x64-open"]);
+ profiles["linux-x86-ri"] = clone(profiles["linux-x86-open"]);
+ profiles["linux-x86-ri-debug"] = clone(profiles["linux-x86-open-debug"]);
+ profiles["windows-x86-ri"] = clone(profiles["windows-x86-open"]);
+
+ // Generate artifacts for ri profiles
+ [ "linux-x64-ri", "linux-x86-ri", "linux-x86-ri-debug", "windows-x86-ri" ]
+ .forEach(function (name) {
+ // Rewrite all remote dirs to "bundles/openjdk/BCL/..."
+ for (artifactName in profiles[name].artifacts) {
+ var artifact = profiles[name].artifacts[artifactName];
+ artifact.remote = replaceAll("\/GPL\/", "/BCL/",
+ (artifact.remote != null ? artifact.remote : artifact.local));
+ }
+ });
+
// Generate the missing platform attributes
profiles = generatePlatformAttributes(profiles);
profiles = generateDefaultMakeTargetsConfigureArg(common, profiles);
@@ -514,78 +918,6 @@
};
/**
- * Generates debug versions of profiles. Clones the given profiles and adds
- * debug metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate debug profiles for
- * @returns {{}} New map of profiles containing debug profiles
- */
-var generateDebugProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var debugProfile = profile + "-debug";
- newProfiles[debugProfile] = clone(profiles[profile]);
- newProfiles[debugProfile].debug_level = "fastdebug";
- newProfiles[debugProfile].default_make_targets
- = common.default_make_targets_debug;
- newProfiles[debugProfile].labels
- = concat(newProfiles[debugProfile].labels || [], "debug"),
- newProfiles[debugProfile].configure_args
- = concat(newProfiles[debugProfile].configure_args,
- common.configure_args_debug);
- }
- return newProfiles;
-};
-
-/**
- * Generates slowdebug versions of profiles. Clones the given profiles and adds
- * debug metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate debug profiles for
- * @returns {{}} New map of profiles containing debug profiles
- */
-var generateSlowdebugProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var debugProfile = profile + "-slowdebug";
- newProfiles[debugProfile] = clone(profiles[profile]);
- newProfiles[debugProfile].debug_level = "slowdebug";
- newProfiles[debugProfile].default_make_targets
- = common.default_make_targets_slowdebug;
- newProfiles[debugProfile].labels
- = concat(newProfiles[debugProfile].labels || [], "slowdebug"),
- newProfiles[debugProfile].configure_args
- = concat(newProfiles[debugProfile].configure_args,
- common.configure_args_slowdebug);
- }
- return newProfiles;
-};
-
-/**
- * Generates open only versions of profiles. Clones the given profiles and adds
- * open metadata.
- *
- * @param common Common values
- * @param profiles Profiles map to generate open only profiles for
- * @returns {{}} New map of profiles containing open only profiles
- */
-var generateOpenOnlyProfiles = function (common, profiles) {
- var newProfiles = {};
- for (var profile in profiles) {
- var openProfile = profile + "-open";
- newProfiles[openProfile] = clone(profiles[profile]);
- newProfiles[openProfile].labels
- = concat(newProfiles[openProfile].labels || [], "open"),
- newProfiles[openProfile].configure_args
- = concat(newProfiles[openProfile].configure_args,
- "--enable-openjdk-only");
- }
- return newProfiles;
-};
-
-/**
* The default_make_targets attribute on a profile is not a real Jib attribute.
* This function rewrites that attribute into the corresponding configure arg.
* Calling this function multiple times on the same profiles object is safe.
@@ -602,10 +934,12 @@
// Iterate over all configure args and see if --with-default-make-target
// is already there and change it, otherwise add it.
var found = false;
- for (var arg in ret[profile].configure_args) {
- if (arg.startsWith("--with-default-make-target")) {
+ for (var i in ret[profile].configure_args) {
+ var arg = ret[profile].configure_args[i];
+ if (arg != null && arg.startsWith("--with-default-make-target=")) {
found = true;
- arg.replace(/=.*/, "=" + targetsString);
+ ret[profile].configure_args[i]
+ = "--with-default-make-target=" + targetsString;
}
}
if (!found) {
@@ -618,6 +952,16 @@
return ret;
}
+var getBuildId = function (input) {
+ if (input.build_id != null) {
+ return input.build_id;
+ } else {
+ var topdir = new java.io.File(__DIR__, "../..").getCanonicalFile().getName();
+ var userName = java.lang.System.getProperty("user.name");
+ return userName + "." + topdir;
+ }
+}
+
/**
* Deep clones an object tree.
*
@@ -638,25 +982,25 @@
};
/**
- * Copies all elements in an array into a new array but replacing all
- * occurrences of original with replacement.
+ * Takes a String or Array of Strings and does a replace operation on each
+ * of them.
*
- * @param original Element to look for
- * @param replacement Element to replace with
- * @param a Array to copy
- * @returns {Array} New array with all occurrences of original replaced
- * with replacement
+ * @param pattern Pattern to look for
+ * @param replacement Replacement text to insert
+ * @param a String or Array of Strings to replace
+ * @returns {Array} Either a new array or a new string depending on the input
*/
-var replace = function (original, replacement, a) {
+var replaceAll = function (pattern, replacement, a) {
+ // If a is an array
+ if (Array === a.constructor) {
var newA = [];
for (var i in a) {
- if (original == a[i]) {
- newA.push(replacement);
+ newA.push(a[i].replace(pattern, replacement));
+ }
+ return newA;
} else {
- newA.push(a[i]);
- }
+ return a.replace(pattern, replacement);
}
- return newA;
};
/**
@@ -669,20 +1013,26 @@
* @returns {{}} New object tree containing the concatenation of o1 and o2
*/
var concatObjects = function (o1, o2) {
+ if (o1 == null) {
+ return clone(o2);
+ }
+ if (o2 == null) {
+ return clone(o1);
+ }
var ret = {};
for (var a in o1) {
if (o2[a] == null) {
- ret[a] = o1[a];
+ ret[a] = clone(o1[a]);
}
}
for (var a in o2) {
if (o1[a] == null) {
- ret[a] = o2[a];
+ ret[a] = clone(o2[a]);
} else {
if (typeof o1[a] == 'string') {
- ret[a] = [o1[a]].concat(o2[a]);
+ ret[a] = clone([o1[a]].concat(o2[a]));
} else if (Array.isArray(o1[a])) {
- ret[a] = o1[a].concat(o2[a]);
+ ret[a] = clone(o1[a].concat(o2[a]));
} else if (typeof o1[a] == 'object') {
ret[a] = concatObjects(o1[a], o2[a]);
}
@@ -690,3 +1040,45 @@
}
return ret;
};
+
+/**
+ * Constructs the numeric version string from reading the
+ * common/autoconf/version-numbers file and removing all trailing ".0".
+ *
+ * @param major Override major version
+ * @param minor Override minor version
+ * @param security Override security version
+ * @param patch Override patch version
+ * @returns {String} The numeric version string
+ */
+var getVersion = function (major, minor, security, patch) {
+ var version_numbers = getVersionNumbers();
+ var version = (major != null ? major : version_numbers.get("DEFAULT_VERSION_MAJOR"))
+ + "." + (minor != null ? minor : version_numbers.get("DEFAULT_VERSION_MINOR"))
+ + "." + (security != null ? security : version_numbers.get("DEFAULT_VERSION_SECURITY"))
+ + "." + (patch != null ? patch : version_numbers.get("DEFAULT_VERSION_PATCH"));
+ while (version.match(".*\.0$")) {
+ version = version.substring(0, version.length - 2);
+ }
+ return version;
+};
+
+// Properties representation of the common/autoconf/version-numbers file. Lazily
+// initiated by the function below.
+var version_numbers;
+
+/**
+ * Read the common/autoconf/version-numbers file into a Properties object.
+ *
+ * @returns {java.utilProperties}
+ */
+var getVersionNumbers = function () {
+ // Read version information from common/autoconf/version-numbers
+ if (version_numbers == null) {
+ version_numbers = new java.util.Properties();
+ var stream = new java.io.FileInputStream(__DIR__ + "/../../common/autoconf/version-numbers");
+ version_numbers.load(stream);
+ stream.close();
+ }
+ return version_numbers;
+}
--- a/hotspot/.hgtags Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/.hgtags Wed Jul 05 22:38:24 2017 +0200
@@ -552,3 +552,4 @@
132a72c782071cc11ab25cc7c9ee167c3632fea4 jdk-9+147
5e4e893520ecdbd517c6ed6375f0885664fe62c4 jdk-9+148
30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149
+98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150
--- a/hotspot/THIRD_PARTY_README Thu Dec 22 18:48:23 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3605 +0,0 @@
-DO NOT TRANSLATE OR LOCALIZE.
------------------------------
-
-%% This notice is provided with respect to ASM Bytecode Manipulation
-Framework v5.0, which may be included with JRE 8, and JDK 8, and
-OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2000-2011 France Télécom
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holders nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to BSDiff v4.3, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright 2003-2005 Colin Percival
-All rights reserved
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted providing that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in the
-documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to CodeViewer 1.0, which may be
-included with JDK 8.
-
---- begin of LICENSE ---
-
-Copyright 1999 by CoolServlets.com.
-
-Any errors or suggested improvements to this class can be reported as
-instructed on CoolServlets.com. We hope you enjoy this program... your
-comments will encourage further development! This software is distributed
-under the terms of the BSD License. Redistribution and use in source and
-binary forms, with or without modification, are permitted provided that the
-following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-Neither name of CoolServlets.com nor the names of its contributors may be
-used to endorse or promote products derived from this software without
-specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Cryptix AES 3.2.0, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Cryptix General License
-
-Copyright (c) 1995-2005 The Cryptix Foundation Limited.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- 1. Redistributions of source code must retain the copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
-CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to CUP Parser Generator for
-Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted, provided
-that the above copyright notice appear in all copies and that both the
-copyright notice and this permission notice and warranty disclaimer appear in
-supporting documentation, and that the names of the authors or their
-employers not be used in advertising or publicity pertaining to distribution of
-the software without specific, written prior permission.
-
-The authors and their employers disclaim all warranties with regard to
-this software, including all implied warranties of merchantability and fitness.
-In no event shall the authors or their employers be liable for any special,
-indirect or consequential damages or any damages whatsoever resulting from
-loss of use, data or profits, whether in an action of contract, negligence or
-other tortious action, arising out of or in connection with the use or
-performance of this software.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Document Object Model (DOM) Level 2
-& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-W3C SOFTWARE NOTICE AND LICENSE
-
-http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
-
-This work (and included software, documentation such as READMEs, or other
-related items) is being provided by the copyright holders under the following
-license. By obtaining, using and/or copying this work, you (the licensee)
-agree that you have read, understood, and will comply with the following terms
-and conditions.
-
-Permission to copy, modify, and distribute this software and its
-documentation, with or without modification, for any purpose and without fee
-or royalty is hereby granted, provided that you include the following on ALL
-copies of the software and documentation or portions thereof, including
-modifications:
-
- 1.The full text of this NOTICE in a location viewable to users of the
- redistributed or derivative work.
-
- 2.Any pre-existing intellectual property disclaimers, notices, or terms and
- conditions. If none exist, the W3C Software Short Notice should be included
- (hypertext is preferred, text is permitted) within the body of any
- redistributed or derivative code.
-
- 3.Notice of any changes or modifications to the files, including the date
- changes were made. (We recommend you provide URIs to the location from
- which the code is derived.)
-
-THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
-MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
-PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
-THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
-
-COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
-OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
-DOCUMENTATION. The name and trademarks of copyright holders may NOT be used
-in advertising or publicity pertaining to the software without specific,
-written prior permission. Title to copyright in this software and any
-associated documentation will at all times remain with copyright holders.
-
-____________________________________
-
-This formulation of W3C's notice and license became active on December 31
-2002. This version removes the copyright ownership notice such that this
-license can be used with materials other than those owned by the W3C, reflects
-that ERCIM is now a host of the W3C, includes references to this specific
-dated version of the license, and removes the ambiguous grant of "use".
-Otherwise, this version is the same as the previous version and is written so
-as to preserve the Free Software Foundation's assessment of GPL compatibility
-and OSI's certification under the Open Source Definition. Please see our
-Copyright FAQ for common questions about using materials from our site,
-including specific terms and conditions for packages like libwww, Amaya, and
-Jigsaw. Other questions about this notice can be directed to
-site-policy@w3.org.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Dynalink v0.5, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2009-2013, Attila Szegedi
-
-All rights reserved.Redistribution and use in source and binary forms, with or
-without modification, are permitted provided that the following conditions are
-met:* Redistributions of source code must retain the above copyright notice,
-this list of conditions and the following disclaimer. * Redistributions in
-binary form must reproduce the above copyright notice, this list of
-conditions and the following disclaimer in the documentation and/or other
-materials provided with the distribution. * Neither the name of Attila
-Szegedi nor the names of its contributors may be used to endorse or promote
-products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Elliptic Curve Cryptography, which
-may be included with JRE 8, JDK 8, and OpenJDK 8.
-
-You are receiving a copy of the Elliptic Curve Cryptography library in source
-form with the JDK 8 and OpenJDK 8 source distributions, and as object code in
-the JRE 8 & JDK 8 runtimes.
-
-In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do
-NOT apply to the Elliptic Curve Cryptography library; it is licensed under the
-following license, separately from Oracle's JDK & JRE. If you do not wish to
-install the Elliptic Curve Cryptography library, you may delete the library
-named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows
-systems) from the JRE bin directory reserved for native libraries.
-
-
---- begin of LICENSE ---
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to ECMAScript Language
-Specification ECMA-262 Edition 5.1 which may be included with
-JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright notice
-Copyright © 2011 Ecma International
-Ecma International
-Rue du Rhone 114
-CH-1204 Geneva
-Tel: +41 22 849 6000
-Fax: +41 22 849 6001
-Web: http://www.ecma-international.org
-
-This document and possible translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it or assist
-in its implementation may be prepared, copied, published, and distributed, in
-whole or in part, without restriction of any kind, provided that the above
-copyright notice and this section are included on all such copies and derivative
-works. However, this document itself may not be modified in any way, including
-by removing the copyright notice or references to Ecma International, except as
-needed for the purpose of developing any document or deliverable produced by
-Ecma International (in which case the rules applied to copyrights must be
-followed) or as required to translate it into languages other than English. The
-limited permissions granted above are perpetual and will not be revoked by Ecma
-International or its successors or assigns. This document and the information
-contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL
-DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
-WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP
-RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
-PURPOSE." Software License
-
-All Software contained in this document ("Software)" is protected by copyright
-and is being made available under the "BSD License", included below. This
-Software may be subject to third party rights (rights from parties other than
-Ecma International), including patent rights, and no licenses under such third
-party rights are granted under this license even if the third party concerned is
-a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS
-AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
-INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO
-IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and
-binary forms, with or without modification, are permitted provided that the
-following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
-list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
-this list of conditions and the following disclaimer in the documentation and/or
-other materials provided with the distribution.
-
-3. Neither the name of the authors nor Ecma International may be used to endorse
-or promote products derived from this software without specific prior written
-permission.
-
-THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
-SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
-OF SUCH DAMAGE.
---- end of LICENSE ---
-
-%% This notice is provided with respect to Dynalink library which is included
-with the Nashorn technology.
-
---- begin of LICENSE ---
-Copyright (c) 2009-2013, Attila Szegedi
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-* Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-* Neither the name of the copyright holder nor the names of
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---- end of LICENSE ---
-
-%% This notice is provided with respect to Joni library which is included
-with the Nashorn technology.
-
---- begin of LICENSE ---
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to FontConfig 2.5, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 source distributions on
-Linux and Solaris.
-
---- begin of LICENSE ---
-
-Copyright © 2001,2003 Keith Packard
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation, and that
-the name of Keith Packard not be used in advertising or publicity pertaining
-to distribution of the software without specific, written prior permission.
-Keith Packard makes no representations about the suitability of this software
-for any purpose. It is provided "as is" without express or implied warranty.
-
-KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH
-PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to IAIK PKCS#11 Wrapper,
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-IAIK PKCS#11 Wrapper License
-
-Copyright (c) 2002 Graz University of Technology. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment:
-
- "This product includes software developed by IAIK of Graz University of
- Technology."
-
- Alternately, this acknowledgment may appear in the software itself, if and
- wherever such third-party acknowledgments normally appear.
-
-4. The names "Graz University of Technology" and "IAIK of Graz University of
- Technology" must not be used to endorse or promote products derived from this
- software without prior written permission.
-
-5. Products derived from this software may not be called "IAIK PKCS Wrapper",
- nor may "IAIK" appear in their name, without prior written permission of
- Graz University of Technology.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which
-may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 1995-2010 International Business Machines Corporation and others
-
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, and/or sell copies of the
-Software, and to permit persons to whom the Software is furnished to do so,
-provided that the above copyright notice(s) and this permission notice appear
-in all copies of the Software and that both the above copyright notice(s) and
-this permission notice appear in supporting documentation.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
-NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
-LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization of the copyright holder.
-All trademarks and registered trademarks mentioned herein are the property of
-their respective owners.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to IJG JPEG 6b, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-This software is copyright (C) 1991-1998, Thomas G. Lane.
-All Rights Reserved except as specified below.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-software (or portions thereof) for any purpose, without fee, subject to these
-conditions:
-(1) If any part of the source code for this software is distributed, then this
-README file must be included, with this copyright and no-warranty notice
-unaltered; and any additions, deletions, or changes to the original files
-must be clearly indicated in accompanying documentation.
-(2) If only executable code is distributed, then the accompanying
-documentation must state that "this software is based in part on the work of
-the Independent JPEG Group".
-(3) Permission for use of this software is granted only if the user accepts
-full responsibility for any undesirable consequences; the authors accept
-NO LIABILITY for damages of any kind.
-
-These conditions apply to any software derived from or based on the IJG code,
-not just to the unmodified library. If you use our work, you ought to
-acknowledge us.
-
-Permission is NOT granted for the use of any IJG author's name or company name
-in advertising or publicity relating to this software or products derived from
-it. This software may be referred to only as "the Independent JPEG Group's
-software".
-
-We specifically permit and encourage the use of this software as the basis of
-commercial products, provided that all warranty or liability claims are
-assumed by the product vendor.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Joni v1.1.9, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to JOpt-Simple v3.0, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- Copyright (c) 2004-2009 Paul R. Holser, Jr.
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
---- end of LICENSE ---
-
---------------------------------------------------------------------------------
-
-%% This notice is provided with respect to JSON, which may be included
-with JRE 8 & JDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2002 JSON.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-The Software shall be used for Good, not Evil.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kerberos functionality, which
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- (C) Copyright IBM Corp. 1999 All Rights Reserved.
- Copyright 1997 The Open Group Research Institute. All rights reserved.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kerberos functionality from
-FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- Copyright (C) 1998 by the FundsXpress, INC.
-
- All rights reserved.
-
- Export of this software from the United States of America may require
- a specific license from the United States Government. It is the
- responsibility of any person or organization contemplating export to
- obtain such a license before exporting.
-
- WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
- distribute this software and its documentation for any purpose and
- without fee is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright notice and
- this permission notice appear in supporting documentation, and that
- the name of FundsXpress. not be used in advertising or publicity pertaining
- to distribution of the software without specific, written prior
- permission. FundsXpress makes no representations about the suitability of
- this software for any purpose. It is provided "as is" without express
- or implied warranty.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Kronos OpenGL headers, which may be
-included with JDK 8 and OpenJDK 8 source distributions.
-
---- begin of LICENSE ---
-
- Copyright (c) 2007 The Khronos Group Inc.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and/or associated documentation files (the "Materials"), to
- deal in the Materials without restriction, including without limitation the
- rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- sell copies of the Materials, and to permit persons to whom the Materials are
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Materials.
-
- THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
- MATERIALS.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Portions Copyright Eastman Kodak Company 1992
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to libpng 1.5.4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-This copy of the libpng notices is provided for your convenience. In case of
-any discrepancy between this copy and the notices in the file png.h that is
-included in the libpng distribution, the latter shall prevail.
-
-COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
-If you modify libpng you may insert additional notices immediately following
-this sentence.
-
-This code is released under the libpng license.
-
-libpng versions 1.2.6, August 15, 2004, through 1.5.4, July 7, 2011, are
-Copyright (c) 2004, 2006-2011 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.2.5
-with the following individual added to the list of Contributing Authors
-
- Cosmin Truta
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
-Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
-
- Simon-Pierre Cadieux
- Eric S. Raymond
- Gilles Vollant
-
-and with the following additions to the disclaimer:
-
- There is no warranty against interference with your enjoyment of the
- library or against infringement. There is no warranty that our
- efforts or the library will fulfill any of your particular purposes
- or needs. This library is provided with all faults, and the entire
- risk of satisfactory quality, performance, accuracy, and effort is with
- the user.
-
-libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
-
- Tom Lane
- Glenn Randers-Pehrson
- Willem van Schaik
-
-libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
-
- John Bowler
- Kevin Bracey
- Sam Bushell
- Magnus Holmgren
- Greg Roelofs
- Tom Tanner
-
-libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-
-For the purposes of this copyright and license, "Contributing Authors"
-is defined as the following set of individuals:
-
- Andreas Dilger
- Dave Martindale
- Guy Eric Schalnat
- Paul Schmidt
- Tim Wegner
-
-The PNG Reference Library is supplied "AS IS". The Contributing Authors
-and Group 42, Inc. disclaim all warranties, expressed or implied,
-including, without limitation, the warranties of merchantability and of
-fitness for any purpose. The Contributing Authors and Group 42, Inc.
-assume no liability for direct, indirect, incidental, special, exemplary,
-or consequential damages, which may result from the use of the PNG
-Reference Library, even if advised of the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented.
-
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
-
-The Contributing Authors and Group 42, Inc. specifically permit, without
-fee, and encourage the use of this source code as a component to
-supporting the PNG file format in commercial products. If you use this
-source code in a product, acknowledgment is not required but would be
-appreciated.
-
-
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
-
- printf("%s",png_get_copyright(NULL));
-
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
-
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
-
-Glenn Randers-Pehrson
-glennrp at users.sourceforge.net
-July 7, 2011
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to libungif 4.1.3, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Little CMS 2.4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Little CMS
-Copyright (c) 1998-2010 Marti Maria Saguer
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the
-U.S. and other countries.
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Mesa 3D Graphics Library v4.1,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions.
-
---- begin of LICENSE ---
-
- Mesa 3-D graphics library
- Version: 4.1
-
- Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included
- in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Mozilla Network Security
-Services (NSS), which is supplied with the JDK test suite in the OpenJDK
-source code repository. It is licensed under Mozilla Public License (MPL),
-version 2.0.
-
-The NSS libraries are supplied in executable form, built from unmodified
-NSS source code labeled with the "NSS_3.13.1_RTM" release tag.
-
-The NSS source code is available in the OpenJDK source code repository at:
- jdk/test/sun/security/pkcs11/nss/src
-
-The NSS libraries are available in the OpenJDK source code repository at:
- jdk/test/sun/security/pkcs11/nss/lib
-
---- begin of LICENSE ---
-
-Mozilla Public License Version 2.0
-==================================
-
-1. Definitions
---------------
-
-1.1. "Contributor"
- means each individual or legal entity that creates, contributes to
- the creation of, or owns Covered Software.
-
-1.2. "Contributor Version"
- means the combination of the Contributions of others (if any) used
- by a Contributor and that particular Contributor's Contribution.
-
-1.3. "Contribution"
- means Covered Software of a particular Contributor.
-
-1.4. "Covered Software"
- means Source Code Form to which the initial Contributor has attached
- the notice in Exhibit A, the Executable Form of such Source Code
- Form, and Modifications of such Source Code Form, in each case
- including portions thereof.
-
-1.5. "Incompatible With Secondary Licenses"
- means
-
- (a) that the initial Contributor has attached the notice described
- in Exhibit B to the Covered Software; or
-
- (b) that the Covered Software was made available under the terms of
- version 1.1 or earlier of the License, but not also under the
- terms of a Secondary License.
-
-1.6. "Executable Form"
- means any form of the work other than Source Code Form.
-
-1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
- a separate file or files, that is not Covered Software.
-
-1.8. "License"
- means this document.
-
-1.9. "Licensable"
- means having the right to grant, to the maximum extent possible,
- whether at the time of the initial grant or subsequently, any and
- all of the rights conveyed by this License.
-
-1.10. "Modifications"
- means any of the following:
-
- (a) any file in Source Code Form that results from an addition to,
- deletion from, or modification of the contents of Covered
- Software; or
-
- (b) any new file in Source Code Form that contains any Covered
- Software.
-
-1.11. "Patent Claims" of a Contributor
- means any patent claim(s), including without limitation, method,
- process, and apparatus claims, in any patent Licensable by such
- Contributor that would be infringed, but for the grant of the
- License, by the making, using, selling, offering for sale, having
- made, import, or transfer of either its Contributions or its
- Contributor Version.
-
-1.12. "Secondary License"
- means either the GNU General Public License, Version 2.0, the GNU
- Lesser General Public License, Version 2.1, the GNU Affero General
- Public License, Version 3.0, or any later versions of those
- licenses.
-
-1.13. "Source Code Form"
- means the form of the work preferred for making modifications.
-
-1.14. "You" (or "Your")
- means an individual or a legal entity exercising rights under this
- License. For legal entities, "You" includes any entity that
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants and Conditions
---------------------------------
-
-2.1. Grants
-
-Each Contributor hereby grants You a world-wide, royalty-free,
-non-exclusive license:
-
-(a) under intellectual property rights (other than patent or trademark)
- Licensable by such Contributor to use, reproduce, make available,
- modify, display, perform, distribute, and otherwise exploit its
- Contributions, either on an unmodified basis, with Modifications, or
- as part of a Larger Work; and
-
-(b) under Patent Claims of such Contributor to make, use, sell, offer
- for sale, have made, import, and otherwise transfer either its
- Contributions or its Contributor Version.
-
-2.2. Effective Date
-
-The licenses granted in Section 2.1 with respect to any Contribution
-become effective for each Contribution on the date the Contributor first
-distributes such Contribution.
-
-2.3. Limitations on Grant Scope
-
-The licenses granted in this Section 2 are the only rights granted under
-this License. No additional rights or licenses will be implied from the
-distribution or licensing of Covered Software under this License.
-Notwithstanding Section 2.1(b) above, no patent license is granted by a
-Contributor:
-
-(a) for any code that a Contributor has removed from Covered Software;
- or
-
-(b) for infringements caused by: (i) Your and any other third party's
- modifications of Covered Software, or (ii) the combination of its
- Contributions with other software (except as part of its Contributor
- Version); or
-
-(c) under Patent Claims infringed by Covered Software in the absence of
- its Contributions.
-
-This License does not grant any rights in the trademarks, service marks,
-or logos of any Contributor (except as may be necessary to comply with
-the notice requirements in Section 3.4).
-
-2.4. Subsequent Licenses
-
-No Contributor makes additional grants as a result of Your choice to
-distribute the Covered Software under a subsequent version of this
-License (see Section 10.2) or under the terms of a Secondary License (if
-permitted under the terms of Section 3.3).
-
-2.5. Representation
-
-Each Contributor represents that the Contributor believes its
-Contributions are its original creation(s) or it has sufficient rights
-to grant the rights to its Contributions conveyed by this License.
-
-2.6. Fair Use
-
-This License is not intended to limit any rights You have under
-applicable copyright doctrines of fair use, fair dealing, or other
-equivalents.
-
-2.7. Conditions
-
-Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
-in Section 2.1.
-
-3. Responsibilities
--------------------
-
-3.1. Distribution of Source Form
-
-All distribution of Covered Software in Source Code Form, including any
-Modifications that You create or to which You contribute, must be under
-the terms of this License. You must inform recipients that the Source
-Code Form of the Covered Software is governed by the terms of this
-License, and how they can obtain a copy of this License. You may not
-attempt to alter or restrict the recipients' rights in the Source Code
-Form.
-
-3.2. Distribution of Executable Form
-
-If You distribute Covered Software in Executable Form then:
-
-(a) such Covered Software must also be made available in Source Code
- Form, as described in Section 3.1, and You must inform recipients of
- the Executable Form how they can obtain a copy of such Source Code
- Form by reasonable means in a timely manner, at a charge no more
- than the cost of distribution to the recipient; and
-
-(b) You may distribute such Executable Form under the terms of this
- License, or sublicense it under different terms, provided that the
- license for the Executable Form does not attempt to limit or alter
- the recipients' rights in the Source Code Form under this License.
-
-3.3. Distribution of a Larger Work
-
-You may create and distribute a Larger Work under terms of Your choice,
-provided that You also comply with the requirements of this License for
-the Covered Software. If the Larger Work is a combination of Covered
-Software with a work governed by one or more Secondary Licenses, and the
-Covered Software is not Incompatible With Secondary Licenses, this
-License permits You to additionally distribute such Covered Software
-under the terms of such Secondary License(s), so that the recipient of
-the Larger Work may, at their option, further distribute the Covered
-Software under the terms of either this License or such Secondary
-License(s).
-
-3.4. Notices
-
-You may not remove or alter the substance of any license notices
-(including copyright notices, patent notices, disclaimers of warranty,
-or limitations of liability) contained within the Source Code Form of
-the Covered Software, except that You may alter any license notices to
-the extent required to remedy known factual inaccuracies.
-
-3.5. Application of Additional Terms
-
-You may choose to offer, and to charge a fee for, warranty, support,
-indemnity or liability obligations to one or more recipients of Covered
-Software. However, You may do so only on Your own behalf, and not on
-behalf of any Contributor. You must make it absolutely clear that any
-such warranty, support, indemnity, or liability obligation is offered by
-You alone, and You hereby agree to indemnify every Contributor for any
-liability incurred by such Contributor as a result of warranty, support,
-indemnity or liability terms You offer. You may include additional
-disclaimers of warranty and limitations of liability specific to any
-jurisdiction.
-
-4. Inability to Comply Due to Statute or Regulation
----------------------------------------------------
-
-If it is impossible for You to comply with any of the terms of this
-License with respect to some or all of the Covered Software due to
-statute, judicial order, or regulation then You must: (a) comply with
-the terms of this License to the maximum extent possible; and (b)
-describe the limitations and the code they affect. Such description must
-be placed in a text file included with all distributions of the Covered
-Software under this License. Except to the extent prohibited by statute
-or regulation, such description must be sufficiently detailed for a
-recipient of ordinary skill to be able to understand it.
-
-5. Termination
---------------
-
-5.1. The rights granted under this License will terminate automatically
-if You fail to comply with any of its terms. However, if You become
-compliant, then the rights granted under this License from a particular
-Contributor are reinstated (a) provisionally, unless and until such
-Contributor explicitly and finally terminates Your grants, and (b) on an
-ongoing basis, if such Contributor fails to notify You of the
-non-compliance by some reasonable means prior to 60 days after You have
-come back into compliance. Moreover, Your grants from a particular
-Contributor are reinstated on an ongoing basis if such Contributor
-notifies You of the non-compliance by some reasonable means, this is the
-first time You have received notice of non-compliance with this License
-from such Contributor, and You become compliant prior to 30 days after
-Your receipt of the notice.
-
-5.2. If You initiate litigation against any entity by asserting a patent
-infringement claim (excluding declaratory judgment actions,
-counter-claims, and cross-claims) alleging that a Contributor Version
-directly or indirectly infringes any patent, then the rights granted to
-You by any and all Contributors for the Covered Software under Section
-2.1 of this License shall terminate.
-
-5.3. In the event of termination under Sections 5.1 or 5.2 above, all
-end user license agreements (excluding distributors and resellers) which
-have been validly granted by You or Your distributors under this License
-prior to termination shall survive termination.
-
-************************************************************************
-* *
-* 6. Disclaimer of Warranty *
-* ------------------------- *
-* *
-* Covered Software is provided under this License on an "as is" *
-* basis, without warranty of any kind, either expressed, implied, or *
-* statutory, including, without limitation, warranties that the *
-* Covered Software is free of defects, merchantable, fit for a *
-* particular purpose or non-infringing. The entire risk as to the *
-* quality and performance of the Covered Software is with You. *
-* Should any Covered Software prove defective in any respect, You *
-* (not any Contributor) assume the cost of any necessary servicing, *
-* repair, or correction. This disclaimer of warranty constitutes an *
-* essential part of this License. No use of any Covered Software is *
-* authorized under this License except under this disclaimer. *
-* *
-************************************************************************
-
-************************************************************************
-* *
-* 7. Limitation of Liability *
-* -------------------------- *
-* *
-* Under no circumstances and under no legal theory, whether tort *
-* (including negligence), contract, or otherwise, shall any *
-* Contributor, or anyone who distributes Covered Software as *
-* permitted above, be liable to You for any direct, indirect, *
-* special, incidental, or consequential damages of any character *
-* including, without limitation, damages for lost profits, loss of *
-* goodwill, work stoppage, computer failure or malfunction, or any *
-* and all other commercial damages or losses, even if such party *
-* shall have been informed of the possibility of such damages. This *
-* limitation of liability shall not apply to liability for death or *
-* personal injury resulting from such party's negligence to the *
-* extent applicable law prohibits such limitation. Some *
-* jurisdictions do not allow the exclusion or limitation of *
-* incidental or consequential damages, so this exclusion and *
-* limitation may not apply to You. *
-* *
-************************************************************************
-
-8. Litigation
--------------
-
-Any litigation relating to this License may be brought only in the
-courts of a jurisdiction where the defendant maintains its principal
-place of business and such litigation shall be governed by laws of that
-jurisdiction, without reference to its conflict-of-law provisions.
-Nothing in this Section shall prevent a party's ability to bring
-cross-claims or counter-claims.
-
-9. Miscellaneous
-----------------
-
-This License represents the complete agreement concerning the subject
-matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed only to the extent
-necessary to make it enforceable. Any law or regulation which provides
-that the language of a contract shall be construed against the drafter
-shall not be used to construe this License against a Contributor.
-
-10. Versions of the License
----------------------------
-
-10.1. New Versions
-
-Mozilla Foundation is the license steward. Except as provided in Section
-10.3, no one other than the license steward has the right to modify or
-publish new versions of this License. Each version will be given a
-distinguishing version number.
-
-10.2. Effect of New Versions
-
-You may distribute the Covered Software under the terms of the version
-of the License under which You originally received the Covered Software,
-or under the terms of any subsequent version published by the license
-steward.
-
-10.3. Modified Versions
-
-If you create software not governed by this License, and you want to
-create a new license for such software, you may create and use a
-modified version of this License if you rename the license and remove
-any references to the name of the license steward (except to note that
-such modified license differs from this License).
-
-10.4. Distributing Source Code Form that is Incompatible With Secondary
-Licenses
-
-If You choose to distribute Source Code Form that is Incompatible With
-Secondary Licenses under the terms of this version of the License, the
-notice described in Exhibit B of this License must be attached.
-
-Exhibit A - Source Code Form License Notice
--------------------------------------------
-
- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-If it is not possible or desirable to put the notice in a particular
-file, then You may include the notice in a location (such as a LICENSE
-file in a relevant directory) where a recipient would be likely to look
-for such a notice.
-
-You may add additional accurate notices of copyright ownership.
-
-Exhibit B - "Incompatible With Secondary Licenses" Notice
----------------------------------------------------------
-
- This Source Code Form is "Incompatible With Secondary Licenses", as
- defined by the Mozilla Public License, v. 2.0.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
-Copyright (c) 1999-2004 David Corcoran <corcoran@linuxnet.com>
-Copyright (c) 1999-2004 Ludovic Rousseau <ludovic.rousseau (at) free.fr>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement:
- This product includes software developed by:
- David Corcoran <corcoran@linuxnet.com>
- http://www.linuxnet.com (MUSCLE)
-4. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-Changes to this license can be made only by the copyright author with
-explicit written consent.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to PorterStemmer v4, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-See: http://tartarus.org/~martin/PorterStemmer
-
-The software is completely free for any purpose, unless notes at the head of
-the program text indicates otherwise (which is rare). In any case, the notes
-about licensing are never more restrictive than the BSD License.
-
-In every case where the software is not written by me (Martin Porter), this
-licensing arrangement has been endorsed by the contributor, and it is
-therefore unnecessary to ask the contributor again to confirm it.
-
-I have not asked any contributors (or their employers, if they have them) for
-proofs that they have the right to distribute their software in this way.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Relax NG Object/Parser v.20050510,
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) Kohsuke Kawaguchi
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions: The above copyright
-notice and this permission notice shall be included in all copies or
-substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to RelaxNGCC v1.12, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-3. The end-user documentation included with the redistribution, if any, must
- include the following acknowledgment:
-
- "This product includes software developed by Daisuke Okajima
- and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)."
-
-Alternately, this acknowledgment may appear in the software itself, if and
-wherever such third-party acknowledgments normally appear.
-
-4. The names of the copyright holders must not be used to endorse or promote
- products derived from this software without prior written permission. For
- written permission, please contact the copyright holders.
-
-5. Products derived from this software may not be called "RELAXNGCC", nor may
- "RELAXNGCC" appear in their name, without prior written permission of the
- copyright holders.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE
-SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to SAX 2.0.1, which may be included
-with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- SAX is free!
-
- In fact, it's not possible to own a license to SAX, since it's been placed in
- the public domain.
-
- No Warranty
-
- Because SAX is released to the public domain, there is no warranty for the
- design or for the software implementation, to the extent permitted by
- applicable law. Except when otherwise stated in writing the copyright holders
- and/or other parties provide SAX "as is" without warranty of any kind, either
- expressed or implied, including, but not limited to, the implied warranties
- of merchantability and fitness for a particular purpose. The entire risk as
- to the quality and performance of SAX is with you. Should SAX prove
- defective, you assume the cost of all necessary servicing, repair or
- correction.
-
- In no event unless required by applicable law or agreed to in writing will
- any copyright holder, or any other party who may modify and/or redistribute
- SAX, be liable to you for damages, including any general, special, incidental
- or consequential damages arising out of the use or inability to use SAX
- (including but not limited to loss of data or data being rendered inaccurate
- or losses sustained by you or third parties or a failure of the SAX to
- operate with any other programs), even if such holder or other party has been
- advised of the possibility of such damages.
-
- Copyright Disclaimers
-
- This page includes statements to that effect by David Megginson, who would
- have been able to claim copyright for the original work. SAX 1.0
-
- Version 1.0 of the Simple API for XML (SAX), created collectively by the
- membership of the XML-DEV mailing list, is hereby released into the public
- domain.
-
- No one owns SAX: you may use it freely in both commercial and non-commercial
- applications, bundle it with your software distribution, include it on a
- CD-ROM, list the source code in a book, mirror the documentation at your own
- web site, or use it in any other way you see fit.
-
- David Megginson, sax@megginson.com
- 1998-05-11
-
- SAX 2.0
-
- I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and
- release all of the SAX 2.0 source code, compiled code, and documentation
- contained in this distribution into the Public Domain. SAX comes with NO
- WARRANTY or guarantee of fitness for any purpose.
-
- David Megginson, david@megginson.com
- 2000-05-05
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to SoftFloat version 2b, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM.
-
---- begin of LICENSE ---
-
-Use of any of this software is governed by the terms of the license below:
-
-SoftFloat was written by me, John R. Hauser. This work was made possible in
-part by the International Computer Science Institute, located at Suite 600,
-1947 Center Street, Berkeley, California 94704. Funding was partially
-provided by the National Science Foundation under grant MIP-9311980. The
-original version of this code was written as part of a project to build
-a fixed-point vector processor in collaboration with the University of
-California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
-
-THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
-has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
-TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
-PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL
-LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO
-FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER
-SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES,
-COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE
-SOFTWARE.
-
-Derivative works are acceptable, even for commercial purposes, provided
-that the minimal documentation requirements stated in the source code are
-satisfied.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Sparkle 1.5,
-which may be included with JRE 8 on Mac OS X.
-
---- begin of LICENSE ---
-
-Copyright (c) 2012 Sparkle.org and Andy Matuschak
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% Portions licensed from Taligent, Inc.
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Thai Dictionary, which may be
-included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Copyright (C) 1982 The Royal Institute, Thai Royal Government.
-
-Copyright (C) 1998 National Electronics and Computer Technology Center,
-National Science and Technology Development Agency,
-Ministry of Science Technology and Environment,
-Thai Royal Government.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1
-which may be included with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
-Unicode Terms of Use
-
-For the general privacy policy governing access to this site, see the Unicode
-Privacy Policy. For trademark usage, see the Unicode® Consortium Name and
-Trademark Usage Policy.
-
-A. Unicode Copyright.
- 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved.
-
- 2. Certain documents and files on this website contain a legend indicating
- that "Modification is permitted." Any person is hereby authorized,
- without fee, to modify such documents and files to create derivative
- works conforming to the Unicode® Standard, subject to Terms and
- Conditions herein.
-
- 3. Any person is hereby authorized, without fee, to view, use, reproduce,
- and distribute all documents and files solely for informational
- purposes in the creation of products supporting the Unicode Standard,
- subject to the Terms and Conditions herein.
-
- 4. Further specifications of rights and restrictions pertaining to the use
- of the particular set of data files known as the "Unicode Character
- Database" can be found in Exhibit 1.
-
- 5. Each version of the Unicode Standard has further specifications of
- rights and restrictions of use. For the book editions (Unicode 5.0 and
- earlier), these are found on the back of the title page. The online
- code charts carry specific restrictions. All other files, including
- online documentation of the core specification for Unicode 6.0 and
- later, are covered under these general Terms of Use.
-
- 6. No license is granted to "mirror" the Unicode website where a fee is
- charged for access to the "mirror" site.
-
- 7. Modification is not permitted with respect to this document. All copies
- of this document must be verbatim.
-
-B. Restricted Rights Legend. Any technical data or software which is licensed
- to the United States of America, its agencies and/or instrumentalities
- under this Agreement is commercial technical data or commercial computer
- software developed exclusively at private expense as defined in FAR 2.101,
- or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use,
- duplication, or disclosure by the Government is subject to restrictions as
- set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov
- 1995) and this Agreement. For Software, in accordance with FAR 12-212 or
- DFARS 227-7202, as applicable, use, duplication or disclosure by the
- Government is subject to the restrictions set forth in this Agreement.
-
-C. Warranties and Disclaimers.
- 1. This publication and/or website may include technical or typographical
- errors or other inaccuracies . Changes are periodically added to the
- information herein; these changes will be incorporated in new editions
- of the publication and/or website. Unicode may make improvements and/or
- changes in the product(s) and/or program(s) described in this
- publication and/or website at any time.
-
- 2. If this file has been purchased on magnetic or optical media from
- Unicode, Inc. the sole and exclusive remedy for any claim will be
- exchange of the defective media within ninety (90) days of original
- purchase.
-
- 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS
- PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED,
- OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
- UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR
- OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH
- ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE.
-
-D. Waiver of Damages. In no event shall Unicode or its licensors be liable for
- any special, incidental, indirect or consequential damages of any kind, or
- any damages whatsoever, whether or not Unicode was advised of the
- possibility of the damage, including, without limitation, those resulting
- from the following: loss of use, data or profits, in connection with the
- use, modification or distribution of this information or its derivatives.
-
-E.Trademarks & Logos.
- 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode,
- Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of
- Unicode, Inc. Use of the information and materials found on this
- website indicates your acknowledgement of Unicode, Inc.’s exclusive
- worldwide rights in the Unicode Word Mark, the Unicode Logo, and the
- Unicode trade names.
-
- 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark
- Policy”) are incorporated herein by reference and you agree to abide by
- the provisions of the Trademark Policy, which may be changed from time
- to time in the sole discretion of Unicode, Inc.
-
- 3. All third party trademarks referenced herein are the property of their
- respective owners.
-
-Miscellaneous.
- 1. Jurisdiction and Venue. This server is operated from a location in the
- State of California, United States of America. Unicode makes no
- representation that the materials are appropriate for use in other
- locations. If you access this server from other locations, you are
- responsible for compliance with local laws. This Agreement, all use of
- this site and any claims and damages resulting from use of this site are
- governed solely by the laws of the State of California without regard to
- any principles which would apply the laws of a different jurisdiction.
- The user agrees that any disputes regarding this site shall be resolved
- solely in the courts located in Santa Clara County, California. The user
- agrees said courts have personal jurisdiction and agree to waive any
- right to transfer the dispute to any other forum.
-
- 2. Modification by Unicode. Unicode shall have the right to modify this
- Agreement at any time by posting it to this site. The user may not
- assign any part of this Agreement without Unicode’s prior written
- consent.
-
- 3. Taxes. The user agrees to pay any taxes arising from access to this
- website or use of the information herein, except for those based on
- Unicode’s net income.
-
- 4. Severability. If any provision of this Agreement is declared invalid or
- unenforceable, the remaining provisions of this Agreement shall remain
- in effect.
-
- 5. Entire Agreement. This Agreement constitutes the entire agreement
- between the parties.
-
-EXHIBIT 1
-UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
-
-Unicode Data Files include all data files under the directories
-http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
-http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF
-online code charts under the directory http://www.unicode.org/Public/.
-Software includes any source code published in the Unicode Standard or under
-the directories http://www.unicode.org/Public/,
-http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
-
-NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
-INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA
-FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO
-BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT
-AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR
-SOFTWARE.
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
-Terms of Use in http://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of the Unicode data files and any associated documentation (the "Data Files")
-or Unicode software and any associated documentation (the "Software") to deal
-in the Data Files or Software without restriction, including without
-limitation the rights to use, copy, modify, merge, publish, distribute, and/or
-sell copies of the Data Files or Software, and to permit persons to whom the
-Data Files or Software are furnished to do so, provided that (a) the above
-copyright notice(s) and this permission notice appear with all copies of the
-Data Files or Software, (b) both the above copyright notice(s) and this
-permission notice appear in associated documentation, and (c) there is clear
-notice in each modified Data File or in the Software as well as in the
-documentation associated with the Data File(s) or Software that the data or
-software has been modified.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
-PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
-THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE
-DATA FILES OR SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in these Data Files or Software without prior written authorization of the
-copyright holder.
-
-Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United
-States and other countries. All third party trademarks referenced herein are
-the property of their respective owners.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to UPX v3.01, which may be included
-with JRE 8 on Windows.
-
---- begin of LICENSE ---
-
-Use of any of this software is governed by the terms of the license below:
-
-
- ooooo ooo ooooooooo. ooooooo ooooo
- `888' `8' `888 `Y88. `8888 d8'
- 888 8 888 .d88' Y888..8P
- 888 8 888ooo88P' `8888'
- 888 8 888 .8PY888.
- `88. .8' 888 d8' `888b
- `YbodP' o888o o888o o88888o
-
-
- The Ultimate Packer for eXecutables
- Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar
- http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
- http://www.nexus.hu/upx
- http://upx.tsx.org
-
-
-PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN
-TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION.
-
-
-ABSTRACT
-========
-
- UPX and UCL are copyrighted software distributed under the terms
- of the GNU General Public License (hereinafter the "GPL").
-
- The stub which is imbedded in each UPX compressed program is part
- of UPX and UCL, and contains code that is under our copyright. The
- terms of the GNU General Public License still apply as compressing
- a program is a special form of linking with our stub.
-
- As a special exception we grant the free usage of UPX for all
- executables, including commercial programs.
- See below for details and restrictions.
-
-
-COPYRIGHT
-=========
-
- UPX and UCL are copyrighted software. All rights remain with the authors.
-
- UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
- UPX is Copyright (C) 1996-2000 Laszlo Molnar
-
- UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
-
-
-GNU GENERAL PUBLIC LICENSE
-==========================
-
- UPX and the UCL library are free software; you can redistribute them
- and/or modify them under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
-
- UPX and UCL are distributed in the hope that they will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING.
-
-
-SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES
-============================================
-
- The stub which is imbedded in each UPX compressed program is part
- of UPX and UCL, and contains code that is under our copyright. The
- terms of the GNU General Public License still apply as compressing
- a program is a special form of linking with our stub.
-
- Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special
- permission to freely use and distribute all UPX compressed programs
- (including commercial ones), subject to the following restrictions:
-
- 1. You must compress your program with a completely unmodified UPX
- version; either with our precompiled version, or (at your option)
- with a self compiled version of the unmodified UPX sources as
- distributed by us.
- 2. This also implies that the UPX stub must be completely unmodfied, i.e.
- the stub imbedded in your compressed program must be byte-identical
- to the stub that is produced by the official unmodified UPX version.
- 3. The decompressor and any other code from the stub must exclusively get
- used by the unmodified UPX stub for decompressing your program at
- program startup. No portion of the stub may get read, copied,
- called or otherwise get used or accessed by your program.
-
-
-ANNOTATIONS
-===========
-
- - You can use a modified UPX version or modified UPX stub only for
- programs that are compatible with the GNU General Public License.
-
- - We grant you special permission to freely use and distribute all UPX
- compressed programs. But any modification of the UPX stub (such as,
- but not limited to, removing our copyright string or making your
- program non-decompressible) will immediately revoke your right to
- use and distribute a UPX compressed program.
-
- - UPX is not a software protection tool; by requiring that you use
- the unmodified UPX version for your proprietary programs we
- make sure that any user can decompress your program. This protects
- both you and your users as nobody can hide malicious code -
- any program that cannot be decompressed is highly suspicious
- by definition.
-
- - You can integrate all or part of UPX and UCL into projects that
- are compatible with the GNU GPL, but obviously you cannot grant
- any special exceptions beyond the GPL for our code in your project.
-
- - We want to actively support manufacturers of virus scanners and
- similar security software. Please contact us if you would like to
- incorporate parts of UPX or UCL into such a product.
-
-
-
-Markus F.X.J. Oberhumer Laszlo Molnar
-markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu
-
-Linz, Austria, 25 Feb 2000
-
-Additional License(s)
-
-The UPX license file is at http://upx.sourceforge.net/upx-license.html.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to Xfree86-VidMode Extension 1.0,
-which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
-Version 1.1 of XFree86 ProjectLicence.
-
-Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicence, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so,subject to the following conditions:
-
- 1. Redistributions of source code must retain the above copyright
- notice,this list of conditions, and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution, and in the same place
- and form as other copyright, license and disclaimer information.
-
- 3. The end-user documentation included with the redistribution, if any,must
- include the following acknowledgment: "This product includes
- software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and
- its contributors", in the same place and form as other third-party
- acknowledgments. Alternately, this acknowledgment may appear in the software
- itself, in the same form and location as other such third-party
- acknowledgments.
-
- 4. Except as contained in this notice, the name of The XFree86 Project,Inc
- shall not be used in advertising or otherwise to promote the sale, use
- or other dealings in this Software without prior written authorization from
- The XFree86 Project, Inc.
-
- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to X Window System 6.8.2, which may be
-included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
-
---- begin of LICENSE ---
-
- Licenses
-The X.Org Foundation March 2004
-
-1. Introduction
-
-The X.org Foundation X Window System distribution is a compilation of code and
-documentation from many sources. This document is intended primarily as a
-guide to the licenses used in the distribution: you must check each file
-and/or package for precise redistribution terms. None-the-less, this summary
-may be useful to many users. No software incorporating the XFree86 1.1 license
-has been incorporated.
-
-This document is based on the compilation from XFree86.
-
-2. XFree86 License
-
-XFree86 code without an explicit copyright is covered by the following
-copyright/license:
-
-Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the XFree86 Project shall not
-be used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from the XFree86 Project.
-
-3. Other Licenses
-
-Portions of code are covered by the following licenses/copyrights. See
-individual files for the copyright dates.
-
-3.1. X/MIT Copyrights
-
-3.1.1. X Consortium
-
-Copyright (C) <date> X Consortium
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
-CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the X Consortium shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-this Software without prior written authorization from the X Consortium.
-
-X Window System is a trademark of X Consortium, Inc.
-
-3.1.2. The Open Group
-
-Copyright <date> The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-this Software without prior written authorization from The Open Group. 3.2.
-Berkeley-based copyrights:
-
-o
-3.2.1. General
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL
-
-Copyright (c) 1993 The Regents of the University of California. All rights
-reserved.
-
-This software was developed by the Computer Systems Engineering group at
-Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to
-Berkeley.
-
-All advertising materials mentioning features or use of this software must
-display the following acknowledgement: This product includes software
-developed by the University of California, Lawrence Berkeley Laboratory.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement: This product includes software
- developed by the University of California, Berkeley and its contributors.
-
- 4. Neither the name of the University nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The
-NetBSD Foundation, Inc.
-
-Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved.
-
-This code is derived from software contributed to The NetBSD Foundation by Ben
-Collver <collver1@attbi.com>
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. All advertising materials mentioning features or use of this software
- must display the following acknowledgement: This product includes software
- developed by the NetBSD Foundation, Inc. and its contributors.
-
- 4. Neither the name of The NetBSD Foundation nor the names of its
- contributors may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS
-IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore
-Ts'o.
-
-Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights
-reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- and the entire permission notice in its entirety, including the disclaimer
- of warranties.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. he name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
-INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller
-
-Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c)
-2001-2002 Damien Miller. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller
-
-Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
-
-Permission to use, copy, modify, and distribute this software for any purpose
-with or without fee is hereby granted, provided that the above copyright
-notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
-OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas
-Winischhofer
-
-Copyright (C) 2001-2004 Thomas Winischhofer
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- 3. The name of the author may not be used to endorse or promote products
- derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp
-
-Copyright (c) 1996 NVIDIA, Corp. All rights reserved.
-
-NOTICE TO USER: The source code is copyrighted under U.S. and international
-laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design
-patents pending on the design and interface of the NV chips. Users and
-possessors of this source code are hereby granted a nonexclusive, royalty-free
-copyright and design patent license to use this code in individual and
-commercial software.
-
-Any use of this source code must include, in the user documentation and
-internal comments to the code, notices to the end user as follows:
-
-Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and
-foreign countries.
-
-NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
-CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
-WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE
-FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
-DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
-CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public
-License
-
-GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License")
-
-Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby
-grants permission to Recipient (defined below), under Recipient's copyrights
-in the Original Software (defined below), to use, copy, modify, merge,
-publish, distribute, sublicense and/or sell copies of Subject Software
-(defined below), and to permit persons to whom the Subject Software is
-furnished in accordance with this License to do the same, subject to all of
-the following terms and conditions, which Recipient accepts by engaging in any
-such use, copying, modifying, merging, publishing, distributing, sublicensing
-or selling:
-
-1. Definitions.
-
- (a) "Original Software" means source code of computer software code which
- is described in Exhibit A as Original Software.
-
- (b) "Modifications" means any addition to or deletion from the substance
- or structure of either the Original Software or any previous
- Modifications. When Subject Software is released as a series of files, a
- Modification means (i) any addition to or deletion from the contents of a
- file containing Original Software or previous Modifications and (ii) any
- new file that contains any part of the Original Code or previous
- Modifications.
-
- (c) "Subject Software" means the Original Software or Modifications or the
- combination of the Original Software and Modifications, or portions of any
- of the foregoing.
-
- (d) "Recipient" means an individual or a legal entity exercising rights
- under, and complying with all of the terms of, this License. For legal
- entities, "Recipient" includes any entity which controls, is controlled
- by, or is under common control with Recipient. For purposes of this
- definition, "control" of an entity means (a) the power, direct or
- indirect, to direct or manage such entity, or (b) ownership of fifty
- percent (50%) or more of the outstanding shares or beneficial ownership of
- such entity.
-
-2. Redistribution of Source Code Subject to These Terms. Redistributions of
-Subject Software in source code form must retain the notice set forth in
-Exhibit A, below, in every file. A copy of this License must be included in
-any documentation for such Subject Software where the recipients' rights
-relating to Subject Software are described. Recipient may distribute the
-source code version of Subject Software under a license of Recipient's choice,
-which may contain terms different from this License, provided that (i)
-Recipient is in compliance with the terms of this License, and (ii) the
-license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of
-this License, which terms may not be modified or superseded by any other terms
-of such license. If Recipient distributes the source code version under a
-different license Recipient must make it absolutely clear that any terms which
-differ from this License are offered by Recipient alone, not by SGI. Recipient
-hereby agrees to indemnify SGI for any liability incurred by SGI as a result
-of any such terms Recipient offers.
-
-3. Redistribution in Executable Form. The notice set forth in Exhibit A must
-be conspicuously included in any notice in an executable version of Subject
-Software, related documentation or collateral in which Recipient describes the
-user's rights relating to the Subject Software. Recipient may distribute the
-executable version of Subject Software under a license of Recipient's choice,
-which may contain terms different from this License, provided that (i)
-Recipient is in compliance with the terms of this License, and (ii) the
-license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of
-this License, which terms may not be modified or superseded by any other terms
-of such license. If Recipient distributes the executable version under a
-different license Recipient must make it absolutely clear that any terms which
-differ from this License are offered by Recipient alone, not by SGI. Recipient
-hereby agrees to indemnify SGI for any liability incurred by SGI as a result
-of any such terms Recipient offers.
-
-4. Termination. This License and the rights granted hereunder will terminate
-automatically if Recipient fails to comply with terms herein and fails to cure
-such breach within 30 days of the breach. Any sublicense to the Subject
-Software which is properly granted shall survive any termination of this
-License absent termination by the terms of such sublicense. Provisions which,
-by their nature, must remain in effect beyond the termination of this License
-shall survive.
-
-5. No Trademark Rights. This License does not grant any rights to use any
-trade name, trademark or service mark whatsoever. No trade name, trademark or
-service mark of SGI may be used to endorse or promote products derived from
-the Subject Software without prior written permission of SGI.
-
-6. No Other Rights. This License does not grant any rights with respect to the
-OpenGL API or to any software or hardware implementation thereof or to any
-other software whatsoever, nor shall any other rights or licenses not
-expressly granted hereunder arise by implication, estoppel or otherwise with
-respect to the Subject Software. Title to and ownership of the Original
-Software at all times remains with SGI. All rights in the Original Software
-not expressly granted under this License are reserved.
-
-7. Compliance with Laws; Non-Infringement. Recipient shall comply with all
-applicable laws and regulations in connection with use and distribution of the
-Subject Software, including but not limited to, all export and import control
-laws and regulations of the U.S. government and other countries. Recipient may
-not distribute Subject Software that (i) in any way infringes (directly or
-contributorily) the rights (including patent, copyright, trade secret,
-trademark or other intellectual property rights of any kind) of any other
-person or entity or (ii) breaches any representation or warranty, express,
-implied or statutory, which under any applicable law it might be deemed to
-have been distributed.
-
-8. Claims of Infringement. If Recipient at any time has knowledge of any one
-or more third party claims that reproduction, modification, use, distribution,
-import or sale of Subject Software (including particular functionality or code
-incorporated in Subject Software) infringes the third party's intellectual
-property rights, Recipient must place in a well-identified web page bearing
-the title "LEGAL" a description of each such claim and a description of the
-party making each such claim in sufficient detail that a user of the Subject
-Software will know whom to contact regarding the claim. Also, upon gaining
-such knowledge of any such claim, Recipient must conspicuously include the URL
-for such web page in the Exhibit A notice required under Sections 2 and 3,
-above, and in the text of any related documentation, license agreement or
-collateral in which Recipient describes end user's rights relating to the
-Subject Software. If Recipient obtains such knowledge after it makes Subject
-Software available to any other person or entity, Recipient shall take other
-steps (such as notifying appropriate mailing lists or newsgroups) reasonably
-calculated to inform those who received the Subject Software that new
-knowledge has been obtained.
-
-9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
-WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
-LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
-MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO
-RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
-PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
-SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
-ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
-HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
-WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
-CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY
-DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
-CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK
-STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
-COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
-THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY
-TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO
-THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT
-ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
-THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.
-
-11. Indemnity. Recipient shall be solely responsible for damages arising,
-directly or indirectly, out of its utilization of rights under this License.
-Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from
-and against any loss, liability, damages, costs or expenses (including the
-payment of reasonable attorneys fees) arising out of Recipient's use,
-modification, reproduction and distribution of the Subject Software or out of
-any representation or warranty made by Recipient.
-
-12. U.S. Government End Users. The Subject Software is a "commercial item"
-consisting of "commercial computer software" as such terms are defined in
-title 48 of the Code of Federal Regulations and all U.S. Government End Users
-acquire only the rights set forth in this License and are subject to the terms
-of this License.
-
-13. Miscellaneous. This License represents the complete agreement concerning
-subject matter hereof. If any provision of this License is held to be
-unenforceable, such provision shall be reformed so as to achieve as nearly as
-possible the same economic effect as the original provision and the remainder
-of this License will remain in effect. This License shall be governed by and
-construed in accordance with the laws of the United States and the State of
-California as applied to agreements entered into and to be performed entirely
-within California between California residents. Any litigation relating to
-this License shall be subject to the exclusive jurisdiction of the Federal
-Courts of the Northern District of California (or, absent subject matter
-jurisdiction in such courts, the courts of the State of California), with
-venue lying exclusively in Santa Clara County, California, with the losing
-party responsible for costs, including without limitation, court costs and
-reasonable attorneys fees and expenses. The application of the United Nations
-Convention on Contracts for the International Sale of Goods is expressly
-excluded. Any law or regulation which provides that the language of a contract
-shall be construed against the drafter shall not apply to this License.
-
-Exhibit A
-
-The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13
-of the GLX Public License Version 1.0 (the "License"). You may not use this
-file except in compliance with those sections of the License. You may obtain a
-copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N.
-Shoreline Blvd., Mountain View, CA 94043 or at
-http://www.sgi.com/software/opensource/glx/license.html.
-
-Software distributed under the License is distributed on an "AS IS" basis. ALL
-WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
-WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON-
-INFRINGEMENT. See the License for the specific language governing rights and
-limitations under the License.
-
-The Original Software is GLX version 1.2 source code, released February, 1999.
-The developer of the Original Software is Silicon Graphics, Inc. Those
-portions of the Subject Software created by Silicon Graphics, Inc. are
-Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID
-Font Code Public License
-
-CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License")
-
-Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI")
-hereby grants permission to Recipient (defined below), under SGI's copyrights
-in the Original Software (defined below), to use, copy, modify, merge,
-publish, distribute, sublicense and/or sell copies of Subject Software
-(defined below) in both source code and executable form, and to permit persons
-to whom the Subject Software is furnished in accordance with this License to
-do the same, subject to all of the following terms and conditions, which
-Recipient accepts by engaging in any such use, copying, modifying, merging,
-publication, distributing, sublicensing or selling:
-
-1. Definitions.
-
- a. "Original Software" means source code of computer software code that is
- described in Exhibit A as Original Software.
-
- b. "Modifications" means any addition to or deletion from the substance or
- structure of either the Original Software or any previous Modifications.
- When Subject Software is released as a series of files, a Modification
- means (i) any addition to or deletion from the contents of a file
- containing Original Software or previous Modifications and (ii) any new
- file that contains any part of the Original Code or previous
- Modifications.
-
- c. "Subject Software" means the Original Software or Modifications or the
- combination of the Original Software and Modifications, or portions of any
- of the foregoing.
-
- d. "Recipient" means an individual or a legal entity exercising rights
- under the terms of this License. For legal entities, "Recipient" includes
- any entity that controls, is controlled by, or is under common control
- with Recipient. For purposes of this definition, "control" of an entity
- means (i) the power, direct or indirect, to direct or manage such entity,
- or (ii) ownership of fifty percent (50%) or more of the outstanding shares
- or beneficial ownership of such entity.
-
- e. "Required Notice" means the notice set forth in Exhibit A to this
- License.
-
- f. "Accompanying Technology" means any software or other technology that
- is not a Modification and that is distributed or made publicly available
- by Recipient with the Subject Software. Separate software files that do
- not contain any Original Software or any previous Modification shall not
- be deemed a Modification, even if such software files are aggregated as
- part of a product, or in any medium of storage, with any file that does
- contain Original Software or any previous Modification.
-
-2. License Terms. All distribution of the Subject Software must be made
-subject to the terms of this License. A copy of this License and the Required
-Notice must be included in any documentation for Subject Software where
-Recipient's rights relating to Subject Software and/or any Accompanying
-Technology are described. Distributions of Subject Software in source code
-form must also include the Required Notice in every file distributed. In
-addition, a ReadMe file entitled "Important Legal Notice" must be distributed
-with each distribution of one or more files that incorporate Subject Software.
-That file must be included with distributions made in both source code and
-executable form. A copy of the License and the Required Notice must be
-included in that file. Recipient may distribute Accompanying Technology under
-a license of Recipient's choice, which may contain terms different from this
-License, provided that (i) Recipient is in compliance with the terms of this
-License, (ii) such other license terms do not modify or supersede the terms of
-this License as applicable to the Subject Software, (iii) Recipient hereby
-indemnifies SGI for any liability incurred by SGI as a result of the
-distribution of Accompanying Technology or the use of other license terms.
-
-3. Termination. This License and the rights granted hereunder will terminate
-automatically if Recipient fails to comply with terms herein and fails to cure
-such breach within 30 days of the breach. Any sublicense to the Subject
-Software that is properly granted shall survive any termination of this
-License absent termination by the terms of such sublicense. Provisions which,
-by their nature, must remain in effect beyond the termination of this License
-shall survive.
-
-4. Trademark Rights. This License does not grant any rights to use any trade
-name, trademark or service mark whatsoever. No trade name, trademark or
-service mark of SGI may be used to endorse or promote products derived from or
-incorporating any Subject Software without prior written permission of SGI.
-
-5. No Other Rights. No rights or licenses not expressly granted hereunder
-shall arise by implication, estoppel or otherwise. Title to and ownership of
-the Original Software at all times remains with SGI. All rights in the
-Original Software not expressly granted under this License are reserved.
-
-6. Compliance with Laws; Non-Infringement. Recipient shall comply with all
-applicable laws and regulations in connection with use and distribution of the
-Subject Software, including but not limited to, all export and import control
-laws and regulations of the U.S. government and other countries. Recipient may
-not distribute Subject Software that (i) in any way infringes (directly or
-contributorily) the rights (including patent, copyright, trade secret,
-trademark or other intellectual property rights of any kind) of any other
-person or entity, or (ii) breaches any representation or warranty, express,
-implied or statutory, which under any applicable law it might be deemed to
-have been distributed.
-
-7. Claims of Infringement. If Recipient at any time has knowledge of any one
-or more third party claims that reproduction, modification, use, distribution,
-import or sale of Subject Software (including particular functionality or code
-incorporated in Subject Software) infringes the third party's intellectual
-property rights, Recipient must place in a well-identified web page bearing
-the title "LEGAL" a description of each such claim and a description of the
-party making each such claim in sufficient detail that a user of the Subject
-Software will know whom to contact regarding the claim. Also, upon gaining
-such knowledge of any such claim, Recipient must conspicuously include the URL
-for such web page in the Required Notice, and in the text of any related
-documentation, license agreement or collateral in which Recipient describes
-end user's rights relating to the Subject Software. If Recipient obtains such
-knowledge after it makes Subject Software available to any other person or
-entity, Recipient shall take other steps (such as notifying appropriate
-mailing lists or newsgroups) reasonably calculated to provide such knowledge
-to those who received the Subject Software.
-
-8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
-WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
-LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
-MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO
-RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
-PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
-SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
-ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
-HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
-WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
-CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR
-THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT
-ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND
-LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED.
-
-10. Indemnity. Recipient shall be solely responsible for damages arising,
-directly or indirectly, out of its utilization of rights under this License.
-Recipient will defend, indemnify and hold SGI and its successors and assigns
-harmless from and against any loss, liability, damages, costs or expenses
-(including the payment of reasonable attorneys fees) arising out of
-(Recipient's use, modification, reproduction and distribution of the Subject
-Software or out of any representation or warranty made by Recipient.
-
-11. U.S. Government End Users. The Subject Software is a "commercial item"
-consisting of "commercial computer software" as such terms are defined in
-title 48 of the Code of Federal Regulations and all U.S. Government End Users
-acquire only the rights set forth in this License and are subject to the terms
-of this License.
-
-12. Miscellaneous. This License represents the complete agreement concerning
-subject matter hereof. If any provision of this License is held to be
-unenforceable by any judicial or administrative authority having proper
-jurisdiction with respect thereto, such provision shall be reformed so as to
-achieve as nearly as possible the same economic effect as the original
-provision and the remainder of this License will remain in effect. This
-License shall be governed by and construed in accordance with the laws of the
-United States and the State of California as applied to agreements entered
-into and to be performed entirely within California between California
-residents. Any litigation relating to this License shall be subject to the
-exclusive jurisdiction of the Federal Courts of the Northern District of
-California (or, absent subject matter jurisdiction in such courts, the courts
-of the State of California), with venue lying exclusively in Santa Clara
-County, California, with the losing party responsible for costs, including
-without limitation, court costs and reasonable attorneys fees and expenses.
-The application of the United Nations Convention on Contracts for the
-International Sale of Goods is expressly excluded. Any law or regulation that
-provides that the language of a contract shall be construed against the
-drafter shall not apply to this License.
-
-Exhibit A
-
-Copyright (c) 1994-1999 Silicon Graphics, Inc.
-
-The contents of this file are subject to the CID Font Code Public License
-Version 1.0 (the "License"). You may not use this file except in compliance
-with the License. You may obtain a copy of the License at Silicon Graphics,
-Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
-or at http://www.sgi.com/software/opensource/cid/license.html
-
-Software distributed under the License is distributed on an "AS IS" basis. ALL
-WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
-WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF
-NON-INFRINGEMENT. See the License for the specific language governing rights
-and limitations under the License.
-
-The Original Software (as defined in the License) is CID font code that was
-developed by Silicon Graphics, Inc. Those portions of the Subject Software (as
-defined in the License) that were created by Silicon Graphics, Inc. are
-Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved.
-
-[NOTE: When using this text in connection with Subject Software delivered
-solely in object code form, Recipient may replace the words "this file" with
-"this software" in both the first and second sentences.] 3.6. Bitstream Vera
-Fonts Copyright
-
-The fonts have a generous copyright, allowing derivative works (as long as
-"Bitstream" or "Vera" are not in the names), and full redistribution (so long
-as they are not *sold* by themselves). They can be be bundled, redistributed
-and sold with any software.
-
-The fonts are distributed under the following copyright:
-
-Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a
-trademark of Bitstream, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of the fonts accompanying this license ("Fonts") and associated documentation
-files (the "Font Software"), to reproduce and distribute the Font Software,
-including without limitation the rights to use, copy, merge, publish,
-distribute, and/or sell copies of the Font Software, and to permit persons to
-whom the Font Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright and trademark notices and this permission notice shall be
-included in all copies of one or more of the Font Software typefaces.
-
-The Font Software may be modified, altered, or added to, and in particular the
-designs of glyphs or characters in the Fonts may be modified and additional
-glyphs or characters may be added to the Fonts, only if the fonts are renamed
-to names not containing either the words "Bitstream" or the word "Vera".
-
-This License becomes null and void to the extent applicable to Fonts or Font
-Software that has been modified and is distributed under the "Bitstream Vera"
-names.
-
-The Font Software may be sold as part of a larger software package but no copy
-of one or more of the Font Software typefaces may be sold by itself.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
-TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION
-BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
-SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO
-USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
-
-Except as contained in this notice, the names of Gnome, the Gnome Foundation,
-and Bitstream Inc., shall not be used in advertising or otherwise to promote
-the sale, use or other dealings in this Font Software without prior written
-authorization from the Gnome Foundation or Bitstream Inc., respectively. For
-further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes
-Inc and URW++ GmbH Luxi font license
-
-Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction
-code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a
-registered trademark of Bigelow & Holmes Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of these Fonts and associated documentation files (the "Font Software"), to
-deal in the Font Software, including without limitation the rights to use,
-copy, merge, publish, distribute, sublicense, and/or sell copies of the Font
-Software, and to permit persons to whom the Font Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright and trademark notices and this permission notice shall be
-included in all copies of one or more of the Font Software.
-
-The Font Software may not be modified, altered, or added to, and in particular
-the designs of glyphs or characters in the Fonts may not be modified nor may
-additional glyphs or characters be added to the Fonts. This License becomes
-null and void when the Fonts or Font Software have been modified.
-
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
-TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++
-GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY
-GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
-INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT
-SOFTWARE.
-
-Except as contained in this notice, the names of Bigelow & Holmes Inc. and
-URW++ GmbH. shall not be used in advertising or otherwise to promote the sale,
-use or other dealings in this Font Software without prior written
-authorization from Bigelow & Holmes Inc. and URW++ GmbH.
-
-For further information, contact:
-
-info@urwpp.de or design@bigelowandholmes.com
-
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to zlib v1.2.5, which may be included
-with JRE 8, JDK 8, and OpenJDK 8.
-
---- begin of LICENSE ---
-
- version 1.2.5, July 18th, 2005
-
- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
-%% This notice is provided with respect to the following which may be
-included with JRE 8, JDK 8, and OpenJDK 8, except where noted:
-
- Apache Commons Math 2.2
- Apache Derby 10.10.1.2 [included with JDK 8]
- Apache Jakarta BCEL 5.2
- Apache Jakarta Regexp 1.4
- Apache Santuario XML Security for Java 1.5.4
- Apache Xalan-Java 2.7.1
- Apache Xerces Java 2.10.0
- Apache XML Resolver 1.1
- Dynalink 0.5
-
-
---- begin of LICENSE ---
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
---- end of LICENSE ---
-
--------------------------------------------------------------------------------
-
--- a/hotspot/make/lib/CompileDtracePostJvm.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/make/lib/CompileDtracePostJvm.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -188,7 +188,6 @@
LIBS := $(LIBDL) -lc -lthread -ldoor, \
MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_dtrace/mapfile-vers, \
OBJECT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR)/objs, \
- STRIP_SYMBOLS := true, \
))
LIBJVM_DB_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/libjvm_db
@@ -206,7 +205,6 @@
LIBS := -lc, \
MAPFILE := $(HOTSPOT_TOPDIR)/make/mapfiles/libjvm_db/mapfile-vers, \
OBJECT_DIR := $(LIBJVM_DB_OUTPUTDIR)/objs, \
- STRIP_SYMBOLS := true, \
))
# We need the generated JvmOffsets.h before we can compile the libjvm_db source code.
--- a/hotspot/make/lib/CompileGtest.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/make/lib/CompileGtest.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -54,6 +54,13 @@
# Disabling switch warning for clang because of test source.
+# Note: On AIX, the gtest test classes linked into the libjvm.so push the TOC
+# size beyond 64k, so we need to link with bigtoc. However, this means that
+# -qpic=large would be advisable to lessen the performance effect of bigtoc.
+# But we want to avoid imposing -qpic=large onto the regular libjvm.so, which
+# has no problem with its TOC, so do this only for object files which are
+# exclusive to the gtest libjvm.so.
+
$(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
LIBRARY := jvm, \
@@ -72,6 +79,7 @@
CFLAGS_windows := -EHsc, \
CFLAGS_solaris := -DGTEST_HAS_EXCEPTIONS=0 -library=stlport4, \
CFLAGS_macosx := -DGTEST_OS_MAC=1, \
+ CFLAGS_aix := -qpic=large, \
CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
DISABLED_WARNINGS_gcc := undef, \
@@ -80,12 +88,14 @@
DISABLED_WARNINGS_solstudio := identexpected, \
LDFLAGS := $(JVM_LDFLAGS), \
LDFLAGS_solaris := -library=stlport4 $(call SET_SHARED_LIBRARY_ORIGIN), \
+ LDFLAGS_aix := -bbigtoc, \
LIBS := $(JVM_LIBS), \
OPTIMIZATION := $(JVM_OPTIMIZATION), \
MAPFILE := $(GTEST_JVM_MAPFILE), \
USE_MAPFILE_FOR_SYMBOLS := true, \
COPY_DEBUG_SYMBOLS := $(GTEST_COPY_DEBUG_SYMBOLS), \
ZIP_EXTERNAL_DEBUG_SYMBOLS := false, \
+ STRIP_SYMBOLS := false, \
PRECOMPILED_HEADER := $(JVM_PRECOMPILED_HEADER), \
PRECOMPILED_HEADER_EXCLUDE := gtest-all.cc gtestMain.cpp, \
))
--- a/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/make/lib/Lib-jdk.hotspot.agent.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -113,7 +113,6 @@
LIBS := $(SA_LIBS), \
MAPFILE := $(SA_MAPFILE), \
OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libsa, \
- STRIP_SYMBOLS := true, \
))
TARGETS += $(BUILD_LIBSA)
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Wed Jul 05 22:38:24 2017 +0200
@@ -14086,7 +14086,7 @@
format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t"
"smulh rscratch2, $op1, $op2\n\t"
- "cmp rscratch2, rscratch1, ASR #31\n\t"
+ "cmp rscratch2, rscratch1, ASR #63\n\t"
"movw rscratch1, #0x80000000\n\t"
"cselw rscratch1, rscratch1, zr, NE\n\t"
"cmpw rscratch1, #1" %}
@@ -14094,7 +14094,7 @@
ins_encode %{
__ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63
__ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
- __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext
+ __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext
__ movw(rscratch1, 0x80000000); // Develop 0 (EQ),
__ cselw(rscratch1, rscratch1, zr, Assembler::NE); // or 0x80000000 (NE)
__ cmpw(rscratch1, 1); // 0x80000000 - 1 => VS
@@ -14112,7 +14112,7 @@
format %{ "mul rscratch1, $op1, $op2\t#overflow check long\n\t"
"smulh rscratch2, $op1, $op2\n\t"
- "cmp rscratch2, rscratch1, ASR #31\n\t"
+ "cmp rscratch2, rscratch1, ASR #63\n\t"
"b$cmp $labl" %}
ins_cost(4 * INSN_COST); // Branch is rare so treat as INSN_COST
ins_encode %{
@@ -14120,7 +14120,7 @@
Assembler::Condition cond = (Assembler::Condition)$cmp$$cmpcode;
__ mul(rscratch1, $op1$$Register, $op2$$Register); // Result bits 0..63
__ smulh(rscratch2, $op1$$Register, $op2$$Register); // Result bits 64..127
- __ cmp(rscratch2, rscratch1, Assembler::ASR, 31); // Top is pure sign ext
+ __ cmp(rscratch2, rscratch1, Assembler::ASR, 63); // Top is pure sign ext
__ br(cond == Assembler::VS ? Assembler::NE : Assembler::EQ, *L);
%}
--- a/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -3111,7 +3111,7 @@
}
void LIR_Assembler::atomic_op(LIR_Code code, LIR_Opr src, LIR_Opr data, LIR_Opr dest, LIR_Opr tmp_op) {
- Address addr = as_Address(src->as_address_ptr(), noreg);
+ Address addr = as_Address(src->as_address_ptr());
BasicType type = src->type();
bool is_oop = type == T_OBJECT || type == T_ARRAY;
--- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -195,95 +195,22 @@
}
}
-// Zero words; len is in bytes
-// Destroys all registers except addr
-// len must be a nonzero multiple of wordSize
-void C1_MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
- assert_different_registers(addr, len, t1, rscratch1, rscratch2);
-
-#ifdef ASSERT
- { Label L;
- tst(len, BytesPerWord - 1);
- br(Assembler::EQ, L);
- stop("len is not a multiple of BytesPerWord");
- bind(L);
- }
-#endif
-
-#ifndef PRODUCT
- block_comment("zero memory");
-#endif
-
- Label loop;
- Label entry;
-
-// Algorithm:
-//
-// scratch1 = cnt & 7;
-// cnt -= scratch1;
-// p += scratch1;
-// switch (scratch1) {
-// do {
-// cnt -= 8;
-// p[-8] = 0;
-// case 7:
-// p[-7] = 0;
-// case 6:
-// p[-6] = 0;
-// // ...
-// case 1:
-// p[-1] = 0;
-// case 0:
-// p += 8;
-// } while (cnt);
-// }
-
- const int unroll = 8; // Number of str(zr) instructions we'll unroll
-
- lsr(len, len, LogBytesPerWord);
- andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll
- sub(len, len, rscratch1); // cnt -= unroll
- // t1 always points to the end of the region we're about to zero
- add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord);
- adr(rscratch2, entry);
- sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
- br(rscratch2);
- bind(loop);
- sub(len, len, unroll);
- for (int i = -unroll; i < 0; i++)
- str(zr, Address(t1, i * wordSize));
- bind(entry);
- add(t1, t1, unroll * wordSize);
- cbnz(len, loop);
-}
-
// preserves obj, destroys len_in_bytes
void C1_MacroAssembler::initialize_body(Register obj, Register len_in_bytes, int hdr_size_in_bytes, Register t1) {
+ assert(hdr_size_in_bytes >= 0, "header size must be positive or 0");
Label done;
- assert(obj != len_in_bytes && obj != t1 && t1 != len_in_bytes, "registers must be different");
- assert((hdr_size_in_bytes & (BytesPerWord - 1)) == 0, "header size is not a multiple of BytesPerWord");
- Register index = len_in_bytes;
- // index is positive and ptr sized
- subs(index, index, hdr_size_in_bytes);
+
+ // len_in_bytes is positive and ptr sized
+ subs(len_in_bytes, len_in_bytes, hdr_size_in_bytes);
br(Assembler::EQ, done);
- // note: for the remaining code to work, index must be a multiple of BytesPerWord
-#ifdef ASSERT
- { Label L;
- tst(index, BytesPerWord - 1);
- br(Assembler::EQ, L);
- stop("index is not a multiple of BytesPerWord");
- bind(L);
- }
-#endif
// Preserve obj
if (hdr_size_in_bytes)
add(obj, obj, hdr_size_in_bytes);
- zero_memory(obj, index, t1);
+ zero_memory(obj, len_in_bytes, t1);
if (hdr_size_in_bytes)
sub(obj, obj, hdr_size_in_bytes);
- // done
bind(done);
}
@@ -294,57 +221,59 @@
try_allocate(obj, noreg, object_size * BytesPerWord, t1, t2, slow_case);
- initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2);
+ initialize_object(obj, klass, noreg, object_size * HeapWordSize, t1, t2, UseTLAB);
}
-void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2) {
+void C1_MacroAssembler::initialize_object(Register obj, Register klass, Register var_size_in_bytes, int con_size_in_bytes, Register t1, Register t2, bool is_tlab_allocated) {
assert((con_size_in_bytes & MinObjAlignmentInBytesMask) == 0,
"con_size_in_bytes is not multiple of alignment");
const int hdr_size_in_bytes = instanceOopDesc::header_size() * HeapWordSize;
initialize_header(obj, klass, noreg, t1, t2);
- // clear rest of allocated space
- const Register index = t2;
- const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below)
- if (var_size_in_bytes != noreg) {
- mov(index, var_size_in_bytes);
- initialize_body(obj, index, hdr_size_in_bytes, t1);
- } else if (con_size_in_bytes <= threshold) {
- // use explicit null stores
- int i = hdr_size_in_bytes;
- if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) {
- str(zr, Address(obj, i));
- i += BytesPerWord;
- }
- for (; i < con_size_in_bytes; i += 2 * BytesPerWord)
- stp(zr, zr, Address(obj, i));
- } else if (con_size_in_bytes > hdr_size_in_bytes) {
- block_comment("zero memory");
- // use loop to null out the fields
+ if (!(UseTLAB && ZeroTLAB && is_tlab_allocated)) {
+ // clear rest of allocated space
+ const Register index = t2;
+ const int threshold = 16 * BytesPerWord; // approximate break even point for code size (see comments below)
+ if (var_size_in_bytes != noreg) {
+ mov(index, var_size_in_bytes);
+ initialize_body(obj, index, hdr_size_in_bytes, t1);
+ } else if (con_size_in_bytes <= threshold) {
+ // use explicit null stores
+ int i = hdr_size_in_bytes;
+ if (i < con_size_in_bytes && (con_size_in_bytes % (2 * BytesPerWord))) {
+ str(zr, Address(obj, i));
+ i += BytesPerWord;
+ }
+ for (; i < con_size_in_bytes; i += 2 * BytesPerWord)
+ stp(zr, zr, Address(obj, i));
+ } else if (con_size_in_bytes > hdr_size_in_bytes) {
+ block_comment("zero memory");
+ // use loop to null out the fields
- int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord;
- mov(index, words / 8);
+ int words = (con_size_in_bytes - hdr_size_in_bytes) / BytesPerWord;
+ mov(index, words / 8);
- const int unroll = 8; // Number of str(zr) instructions we'll unroll
- int remainder = words % unroll;
- lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord));
+ const int unroll = 8; // Number of str(zr) instructions we'll unroll
+ int remainder = words % unroll;
+ lea(rscratch1, Address(obj, hdr_size_in_bytes + remainder * BytesPerWord));
- Label entry_point, loop;
- b(entry_point);
+ Label entry_point, loop;
+ b(entry_point);
- bind(loop);
- sub(index, index, 1);
- for (int i = -unroll; i < 0; i++) {
- if (-i == remainder)
- bind(entry_point);
- str(zr, Address(rscratch1, i * wordSize));
- }
- if (remainder == 0)
- bind(entry_point);
- add(rscratch1, rscratch1, unroll * wordSize);
- cbnz(index, loop);
+ bind(loop);
+ sub(index, index, 1);
+ for (int i = -unroll; i < 0; i++) {
+ if (-i == remainder)
+ bind(entry_point);
+ str(zr, Address(rscratch1, i * wordSize));
+ }
+ if (remainder == 0)
+ bind(entry_point);
+ add(rscratch1, rscratch1, unroll * wordSize);
+ cbnz(index, loop);
+ }
}
membar(StoreStore);
--- a/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/c1_MacroAssembler_aarch64.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -36,7 +36,6 @@
// initialization
void pd_init() { _rsp_offset = 0; }
-void zero_memory(Register addr, Register len, Register t1);
public:
void try_allocate(
@@ -75,7 +74,8 @@
Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
int con_size_in_bytes, // object size in bytes if known at compile time
Register t1, // temp register
- Register t2 // temp register
+ Register t2, // temp register
+ bool is_tlab_allocated // the object was allocated in a TLAB; relevant for the implementation of ZeroTLAB
);
// allocation of fixed-size objects
--- a/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/c1_Runtime1_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -728,7 +728,7 @@
__ tlab_allocate(obj, obj_size, 0, t1, t2, slow_path);
- __ initialize_object(obj, klass, obj_size, 0, t1, t2);
+ __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ true);
__ verify_oop(obj);
__ ldp(r5, r19, Address(__ post(sp, 2 * wordSize)));
__ ret(lr);
@@ -740,7 +740,7 @@
__ eden_allocate(obj, obj_size, 0, t1, slow_path);
__ incr_allocated_bytes(rthread, obj_size, 0, rscratch1);
- __ initialize_object(obj, klass, obj_size, 0, t1, t2);
+ __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ false);
__ verify_oop(obj);
__ ldp(r5, r19, Address(__ post(sp, 2 * wordSize)));
__ ret(lr);
@@ -853,7 +853,9 @@
__ andr(t1, t1, Klass::_lh_header_size_mask);
__ sub(arr_size, arr_size, t1); // body length
__ add(t1, t1, obj); // body start
- __ initialize_body(t1, arr_size, 0, t2);
+ if (!ZeroTLAB) {
+ __ initialize_body(t1, arr_size, 0, t2);
+ }
__ verify_oop(obj);
__ ret(lr);
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -3944,12 +3944,82 @@
add(top, top, t1);
sub(top, top, (int32_t)ThreadLocalAllocBuffer::alignment_reserve_in_bytes());
str(top, Address(rthread, in_bytes(JavaThread::tlab_end_offset())));
+
+ if (ZeroTLAB) {
+ // This is a fast TLAB refill, therefore the GC is not notified of it.
+ // So compiled code must fill the new TLAB with zeroes.
+ ldr(top, Address(rthread, in_bytes(JavaThread::tlab_start_offset())));
+ zero_memory(top,t1,t2);
+ }
+
verify_tlab();
b(retry);
return rthread; // for use by caller
}
+// Zero words; len is in bytes
+// Destroys all registers except addr
+// len must be a nonzero multiple of wordSize
+void MacroAssembler::zero_memory(Register addr, Register len, Register t1) {
+ assert_different_registers(addr, len, t1, rscratch1, rscratch2);
+
+#ifdef ASSERT
+ { Label L;
+ tst(len, BytesPerWord - 1);
+ br(Assembler::EQ, L);
+ stop("len is not a multiple of BytesPerWord");
+ bind(L);
+ }
+#endif
+
+#ifndef PRODUCT
+ block_comment("zero memory");
+#endif
+
+ Label loop;
+ Label entry;
+
+// Algorithm:
+//
+// scratch1 = cnt & 7;
+// cnt -= scratch1;
+// p += scratch1;
+// switch (scratch1) {
+// do {
+// cnt -= 8;
+// p[-8] = 0;
+// case 7:
+// p[-7] = 0;
+// case 6:
+// p[-6] = 0;
+// // ...
+// case 1:
+// p[-1] = 0;
+// case 0:
+// p += 8;
+// } while (cnt);
+// }
+
+ const int unroll = 8; // Number of str(zr) instructions we'll unroll
+
+ lsr(len, len, LogBytesPerWord);
+ andr(rscratch1, len, unroll - 1); // tmp1 = cnt % unroll
+ sub(len, len, rscratch1); // cnt -= unroll
+ // t1 always points to the end of the region we're about to zero
+ add(t1, addr, rscratch1, Assembler::LSL, LogBytesPerWord);
+ adr(rscratch2, entry);
+ sub(rscratch2, rscratch2, rscratch1, Assembler::LSL, 2);
+ br(rscratch2);
+ bind(loop);
+ sub(len, len, unroll);
+ for (int i = -unroll; i < 0; i++)
+ str(zr, Address(t1, i * wordSize));
+ bind(entry);
+ add(t1, t1, unroll * wordSize);
+ cbnz(len, loop);
+}
+
// Defines obj, preserves var_size_in_bytes
void MacroAssembler::eden_allocate(Register obj,
Register var_size_in_bytes,
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -857,6 +857,7 @@
Label& slow_case // continuation point if fast allocation fails
);
Register tlab_refill(Label& retry_tlab, Label& try_eden, Label& slow_case); // returns TLS address
+ void zero_memory(Register addr, Register len, Register t1);
void verify_tlab();
void incr_allocated_bytes(Register thread,
--- a/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/aarch64/vm/sharedRuntime_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -282,7 +282,7 @@
regs[i].set_bad();
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -303,7 +303,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_j) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
@@ -840,7 +840,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -862,7 +862,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_c) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
--- a/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/arm/vm/sharedRuntime_arm.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -453,7 +453,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
// fall through
case T_ARRAY:
case T_OBJECT:
@@ -478,7 +478,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if (fp_reg < FPR_PARAMS) {
FloatRegister r = as_FloatRegister(fp_reg);
regs[i].set2(r->as_VMReg());
@@ -532,7 +532,7 @@
#ifndef __ABI_HARD__
case T_DOUBLE:
#endif // !__ABI_HARD__
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if (ireg <= 2) {
#if (ALIGN_WIDE_ARGUMENTS == 1)
if(ireg & 1) ireg++; // Aligned location required
--- a/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/abstractInterpreter_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -51,19 +51,25 @@
return i;
}
-// Support abs and sqrt like in compiler.
-// For others we can use a normal (native) entry.
-bool AbstractInterpreter::math_entry_available(AbstractInterpreter::MethodKind kind) {
- if (!InlineIntrinsics) return false;
-
- return ((kind==Interpreter::java_lang_math_sqrt && VM_Version::has_fsqrt()) ||
- (kind==Interpreter::java_lang_math_abs));
-}
-
// These should never be compiled since the interpreter will prefer
// the compiled version to the intrinsic version.
bool AbstractInterpreter::can_be_compiled(methodHandle m) {
- return !math_entry_available(method_kind(m));
+ switch (method_kind(m)) {
+ case Interpreter::java_lang_math_sin : // fall thru
+ case Interpreter::java_lang_math_cos : // fall thru
+ case Interpreter::java_lang_math_tan : // fall thru
+ case Interpreter::java_lang_math_abs : // fall thru
+ case Interpreter::java_lang_math_log : // fall thru
+ case Interpreter::java_lang_math_log10 : // fall thru
+ case Interpreter::java_lang_math_sqrt : // fall thru
+ case Interpreter::java_lang_math_pow : // fall thru
+ case Interpreter::java_lang_math_exp : // fall thru
+ case Interpreter::java_lang_math_fmaD : // fall thru
+ case Interpreter::java_lang_math_fmaF :
+ return false;
+ default:
+ return true;
+ }
}
// How much stack a method activation needs in stack slots.
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -460,16 +460,15 @@
FCTIWZ_OPCODE = (63u << OPCODE_SHIFT | 15u << 1),
FRSP_OPCODE = (63u << OPCODE_SHIFT | 12u << 1),
- // WARNING: using fmadd results in a non-compliant vm. Some floating
- // point tck tests will fail.
- FMADD_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),
- DMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),
- FMSUB_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),
- DMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),
- FNMADD_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),
- DNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),
- FNMSUB_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),
- DNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),
+ // Fused multiply-accumulate instructions.
+ FMADD_OPCODE = (63u << OPCODE_SHIFT | 29u << 1),
+ FMADDS_OPCODE = (59u << OPCODE_SHIFT | 29u << 1),
+ FMSUB_OPCODE = (63u << OPCODE_SHIFT | 28u << 1),
+ FMSUBS_OPCODE = (59u << OPCODE_SHIFT | 28u << 1),
+ FNMADD_OPCODE = (63u << OPCODE_SHIFT | 31u << 1),
+ FNMADDS_OPCODE = (59u << OPCODE_SHIFT | 31u << 1),
+ FNMSUB_OPCODE = (63u << OPCODE_SHIFT | 30u << 1),
+ FNMSUBS_OPCODE = (59u << OPCODE_SHIFT | 30u << 1),
LFD_OPCODE = (50u << OPCODE_SHIFT | 00u << 1),
LFDU_OPCODE = (51u << OPCODE_SHIFT | 00u << 1),
@@ -1939,6 +1938,26 @@
inline void fdivs( FloatRegister d, FloatRegister a, FloatRegister b);
inline void fdivs_(FloatRegister d, FloatRegister a, FloatRegister b);
+ // Fused multiply-accumulate instructions.
+ // WARNING: Use only when rounding between the 2 parts is not desired.
+ // Some floating point tck tests will fail if used incorrectly.
+ inline void fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+ inline void fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b);
+
// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions
inline void frsp( FloatRegister d, FloatRegister b);
inline void fctid( FloatRegister d, FloatRegister b);
--- a/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -700,6 +700,26 @@
inline void Assembler::fdivs( FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(0)); }
inline void Assembler::fdivs_(FloatRegister d, FloatRegister a, FloatRegister b) { emit_int32( FDIVS_OPCODE | frt(d) | fra(a) | frb(b) | rc(1)); }
+// Fused multiply-accumulate instructions.
+// WARNING: Use only when rounding between the 2 parts is not desired.
+// Some floating point tck tests will fail if used incorrectly.
+inline void Assembler::fmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmadds_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fmsubs_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmadd( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmadd_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADD_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmadds( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmadds_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMADDS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmsub( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmsub_( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUB_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+inline void Assembler::fnmsubs( FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(0)); }
+inline void Assembler::fnmsubs_(FloatRegister d, FloatRegister a, FloatRegister c, FloatRegister b) { emit_int32( FNMSUBS_OPCODE | frt(d) | fra(a) | frb(b) | frc(c) | rc(1)); }
+
// PPC 1, section 4.6.6 Floating-Point Rounding and Conversion Instructions
inline void Assembler::frsp( FloatRegister d, FloatRegister b) { emit_int32( FRSP_OPCODE | frt(d) | frb(b) | rc(0)); }
inline void Assembler::fctid( FloatRegister d, FloatRegister b) { emit_int32( FCTID_OPCODE | frt(d) | frb(b) | rc(0)); }
--- a/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRAssembler_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -292,28 +292,28 @@
}
-void LIR_Assembler::emit_op3(LIR_Op3* op) {
- const bool is_int = op->result_opr()->is_single_cpu();
- Register Rdividend = is_int ? op->in_opr1()->as_register() : op->in_opr1()->as_register_lo();
+void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr temp, LIR_Opr result, CodeEmitInfo* info) {
+ const bool is_int = result->is_single_cpu();
+ Register Rdividend = is_int ? left->as_register() : left->as_register_lo();
Register Rdivisor = noreg;
- Register Rscratch = op->in_opr3()->as_register();
- Register Rresult = is_int ? op->result_opr()->as_register() : op->result_opr()->as_register_lo();
+ Register Rscratch = temp->as_register();
+ Register Rresult = is_int ? result->as_register() : result->as_register_lo();
long divisor = -1;
- if (op->in_opr2()->is_register()) {
- Rdivisor = is_int ? op->in_opr2()->as_register() : op->in_opr2()->as_register_lo();
+ if (right->is_register()) {
+ Rdivisor = is_int ? right->as_register() : right->as_register_lo();
} else {
- divisor = is_int ? op->in_opr2()->as_constant_ptr()->as_jint()
- : op->in_opr2()->as_constant_ptr()->as_jlong();
+ divisor = is_int ? right->as_constant_ptr()->as_jint()
+ : right->as_constant_ptr()->as_jlong();
}
assert(Rdividend != Rscratch, "");
assert(Rdivisor != Rscratch, "");
- assert(op->code() == lir_idiv || op->code() == lir_irem, "Must be irem or idiv");
+ assert(code == lir_idiv || code == lir_irem, "Must be irem or idiv");
if (Rdivisor == noreg) {
if (divisor == 1) { // stupid, but can happen
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ mr_if_needed(Rresult, Rdividend);
} else {
__ li(Rresult, 0);
@@ -340,7 +340,7 @@
}
__ add(Rscratch, Rdividend, Rscratch);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
if (is_int) {
__ srawi(Rresult, Rscratch, log2);
} else {
@@ -352,7 +352,7 @@
}
} else if (divisor == -1) {
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ neg(Rresult, Rdividend);
} else {
__ li(Rresult, 0);
@@ -360,7 +360,7 @@
} else {
__ load_const_optimized(Rscratch, divisor);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
if (is_int) {
__ divw(Rresult, Rdividend, Rscratch); // Can't divide minint/-1.
} else {
@@ -389,7 +389,7 @@
__ cmpdi(CCR0, Rdivisor, -1);
}
__ bne(CCR0, regular);
- if (op->code() == lir_idiv) {
+ if (code == lir_idiv) {
__ neg(Rresult, Rdividend);
__ b(done);
__ bind(regular);
@@ -415,6 +415,26 @@
}
+void LIR_Assembler::emit_op3(LIR_Op3* op) {
+ switch (op->code()) {
+ case lir_idiv:
+ case lir_irem:
+ arithmetic_idiv(op->code(), op->in_opr1(), op->in_opr2(), op->in_opr3(),
+ op->result_opr(), op->info());
+ break;
+ case lir_fmad:
+ __ fmadd(op->result_opr()->as_double_reg(), op->in_opr1()->as_double_reg(),
+ op->in_opr2()->as_double_reg(), op->in_opr3()->as_double_reg());
+ break;
+ case lir_fmaf:
+ __ fmadds(op->result_opr()->as_float_reg(), op->in_opr1()->as_float_reg(),
+ op->in_opr2()->as_float_reg(), op->in_opr3()->as_float_reg());
+ break;
+ default: ShouldNotReachHere(); break;
+ }
+}
+
+
void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) {
#ifdef ASSERT
assert(op->block() == NULL || op->block()->label() == op->label(), "wrong label");
--- a/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1435,7 +1435,26 @@
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
- fatal("FMA intrinsic is not implemented on this platform");
+ assert(x->number_of_arguments() == 3, "wrong type");
+ assert(UseFMA, "Needs FMA instructions support.");
+ LIRItem value(x->argument_at(0), this);
+ LIRItem value1(x->argument_at(1), this);
+ LIRItem value2(x->argument_at(2), this);
+
+ value.load_item();
+ value1.load_item();
+ value2.load_item();
+
+ LIR_Opr calc_input = value.result();
+ LIR_Opr calc_input1 = value1.result();
+ LIR_Opr calc_input2 = value2.result();
+ LIR_Opr calc_result = rlock_result(x);
+
+ switch (x->id()) {
+ case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
+ case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
+ default: ShouldNotReachHere();
+ }
}
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
--- a/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/globals_ppc.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -42,6 +42,9 @@
#define DEFAULT_STACK_YELLOW_PAGES (2)
#define DEFAULT_STACK_RED_PAGES (1)
+// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the
+// stack if compiled for unix and LP64. To pass stack overflow tests we need
+// 20 shadow pages.
#define DEFAULT_STACK_SHADOW_PAGES (20 DEBUG_ONLY(+2))
#define DEFAULT_STACK_RESERVED_PAGES (1)
--- a/hotspot/src/cpu/ppc/vm/ppc.ad Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad Wed Jul 05 22:38:24 2017 +0200
@@ -9569,6 +9569,117 @@
ins_pipe(pipe_class_default);
%}
+
+// Multiply-Accumulate
+// src1 * src2 + src3
+instruct maddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF src3 (Binary src1 src2)));
+
+ format %{ "FMADDS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmadds);
+ __ fmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 + src3
+instruct maddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD src3 (Binary src1 src2)));
+
+ format %{ "FMADD $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmadd);
+ __ fmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 + src3 = -(src1*src2-src3)
+instruct mnsubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF src3 (Binary (NegF src1) src2)));
+ match(Set dst (FmaF src3 (Binary src1 (NegF src2))));
+
+ format %{ "FNMSUBS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmsubs);
+ __ fnmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 + src3 = -(src1*src2-src3)
+instruct mnsubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD src3 (Binary (NegD src1) src2)));
+ match(Set dst (FmaD src3 (Binary src1 (NegD src2))));
+
+ format %{ "FNMSUB $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmsub);
+ __ fnmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 - src3 = -(src1*src2+src3)
+instruct mnaddF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF (NegF src3) (Binary (NegF src1) src2)));
+ match(Set dst (FmaF (NegF src3) (Binary src1 (NegF src2))));
+
+ format %{ "FNMADDS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmadds);
+ __ fnmadds($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// -src1 * src2 - src3 = -(src1*src2+src3)
+instruct mnaddD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD (NegD src3) (Binary (NegD src1) src2)));
+ match(Set dst (FmaD (NegD src3) (Binary src1 (NegD src2))));
+
+ format %{ "FNMADD $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fnmadd);
+ __ fnmadd($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 - src3
+instruct msubF_reg_reg(regF dst, regF src1, regF src2, regF src3) %{
+ match(Set dst (FmaF (NegF src3) (Binary src1 src2)));
+
+ format %{ "FMSUBS $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmsubs);
+ __ fmsubs($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// src1 * src2 - src3
+instruct msubD_reg_reg(regD dst, regD src1, regD src2, regD src3) %{
+ match(Set dst (FmaD (NegD src3) (Binary src1 src2)));
+
+ format %{ "FMSUB $dst, $src1, $src2, $src3" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_fmsub);
+ __ fmsub($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister, $src3$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+
//----------Logical Instructions-----------------------------------------------
// And Instructions
--- a/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -594,7 +594,7 @@
regs[i].set1(reg);
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (ireg < num_java_iarg_registers) {
// Put long in register.
reg = java_iarg_reg[ireg];
@@ -637,7 +637,7 @@
regs[i].set1(reg);
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < num_java_farg_registers) {
// Put double in register.
reg = java_farg_reg[freg];
@@ -809,7 +809,7 @@
regs[i].set1(reg);
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < Argument::n_float_register_parameters_c) {
// Put double in register ...
reg = farg_reg[freg];
--- a/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/templateInterpreterGenerator_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1134,14 +1134,57 @@
// End of helpers
address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
- if (!Interpreter::math_entry_available(kind)) {
- NOT_PRODUCT(__ should_not_reach_here();)
- return NULL;
+
+ // Decide what to do: Use same platform specific instructions and runtime calls as compilers.
+ bool use_instruction = false;
+ address runtime_entry = NULL;
+ int num_args = 1;
+ bool double_precision = true;
+
+ // PPC64 specific:
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt: use_instruction = VM_Version::has_fsqrt(); break;
+ case Interpreter::java_lang_math_abs: use_instruction = true; break;
+ case Interpreter::java_lang_math_fmaF:
+ case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break;
+ default: break; // Fall back to runtime call.
}
+ switch (kind) {
+ case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
+ case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
+ case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
+ case Interpreter::java_lang_math_abs : /* run interpreted */ break;
+ case Interpreter::java_lang_math_sqrt : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); break;
+ case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break;
+ case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break;
+ case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break;
+ case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break;
+ case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break;
+ case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break;
+ default: ShouldNotReachHere();
+ }
+
+ // Use normal entry if neither instruction nor runtime call is used.
+ if (!use_instruction && runtime_entry == NULL) return NULL;
+
address entry = __ pc();
- __ lfd(F1_RET, Interpreter::stackElementSize, R15_esp);
+ // Load arguments
+ assert(num_args <= 13, "passed in registers");
+ if (double_precision) {
+ int offset = (2 * num_args - 1) * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ lfd(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp);
+ offset -= 2 * Interpreter::stackElementSize;
+ }
+ } else {
+ int offset = num_args * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ lfs(as_FloatRegister(F1_ARG1->encoding() + i), offset, R15_esp);
+ offset -= Interpreter::stackElementSize;
+ }
+ }
// Pop c2i arguments (if any) off when we return.
#ifdef ASSERT
@@ -1152,15 +1195,30 @@
#endif // ASSERT
__ mr(R1_SP, R21_sender_SP); // Cut the stack back to where the caller started.
- if (kind == Interpreter::java_lang_math_sqrt) {
- __ fsqrt(F1_RET, F1_RET);
- } else if (kind == Interpreter::java_lang_math_abs) {
- __ fabs(F1_RET, F1_RET);
+ if (use_instruction) {
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt: __ fsqrt(F1_RET, F1); break;
+ case Interpreter::java_lang_math_abs: __ fabs(F1_RET, F1); break;
+ case Interpreter::java_lang_math_fmaF: __ fmadds(F1_RET, F1, F2, F3); break;
+ case Interpreter::java_lang_math_fmaD: __ fmadd(F1_RET, F1, F2, F3); break;
+ default: ShouldNotReachHere();
+ }
} else {
- ShouldNotReachHere();
+ // Comment: Can use tail call if the unextended frame is always C ABI compliant:
+ //__ load_const_optimized(R12_scratch2, runtime_entry, R0);
+ //__ call_c_and_return_to_caller(R12_scratch2);
+
+ // Push a new C frame and save LR.
+ __ save_LR_CR(R0);
+ __ push_frame_reg_args(0, R11_scratch1);
+
+ __ call_VM_leaf(runtime_entry);
+
+ // Pop the C frame and restore LR.
+ __ pop_frame();
+ __ restore_LR_CR(R0);
}
- // And we're done.
__ blr();
__ flush();
--- a/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -230,9 +230,8 @@
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
}
- if (UseFMA) {
- warning("FMA instructions are not available on this CPU");
- FLAG_SET_DEFAULT(UseFMA, false);
+ if (FLAG_IS_DEFAULT(UseFMA)) {
+ FLAG_SET_DEFAULT(UseFMA, true);
}
if (UseSHA) {
--- a/hotspot/src/cpu/s390/vm/assembler_s390.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/assembler_s390.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -790,6 +790,16 @@
#define MDB_ZOPC (unsigned long)(237L << 40 | 28)
#define MXDB_ZOPC (unsigned long)(237L << 40 | 7)
+// Multiply-Add
+#define MAEBR_ZOPC (unsigned int)(179 << 24 | 14 << 16)
+#define MADBR_ZOPC (unsigned int)(179 << 24 | 30 << 16)
+#define MSEBR_ZOPC (unsigned int)(179 << 24 | 15 << 16)
+#define MSDBR_ZOPC (unsigned int)(179 << 24 | 31 << 16)
+#define MAEB_ZOPC (unsigned long)(237L << 40 | 14)
+#define MADB_ZOPC (unsigned long)(237L << 40 | 30)
+#define MSEB_ZOPC (unsigned long)(237L << 40 | 15)
+#define MSDB_ZOPC (unsigned long)(237L << 40 | 31)
+
// Divide
// RR, signed
#define DSGFR_ZOPC (unsigned int)(0xb91d << 16)
@@ -2205,6 +2215,20 @@
inline void z_meeb( FloatRegister f1, const Address& a);
inline void z_mdb( FloatRegister f1, const Address& a);
+ // MUL-ADD
+ inline void z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; float
+ inline void z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 + f1 ; double
+ inline void z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; float
+ inline void z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2); // f1 = f3 * f2 - f1 ; double
+ inline void z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; float
+ inline void z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) + f1 ; double
+ inline void z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; float
+ inline void z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2); // f1 = f3 * *(d2+x2+b2) - f1 ; double
+ inline void z_maeb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_madb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_mseb(FloatRegister f1, FloatRegister f3, const Address& a);
+ inline void z_msdb(FloatRegister f1, FloatRegister f3, const Address& a);
+
// DIV
inline void z_debr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; float
inline void z_ddbr( FloatRegister f1, FloatRegister f2); // f1 = f1 / f2 ; double
--- a/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/assembler_s390.inline.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -778,6 +778,23 @@
//---------------
+// MUL-ADD
+//---------------
+inline void Assembler::z_maebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MAEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_madbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MADBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_msebr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSEBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_msdbr(FloatRegister f1, FloatRegister f3, FloatRegister f2) { emit_32( MSDBR_ZOPC | fregt(f1, 16, 32) | freg(f3, 24, 32) | freg(f2, 28, 32) );}
+inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MAEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MADB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSEB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, int64_t d2, Register x2, Register b2) { emit_48( MSDB_ZOPC | fregt(f1, 32, 48) | freg(f3, 8, 48) | uimm12(d2, 20, 48) | reg(x2, 12, 48) | regz(b2, 16, 48) );}
+inline void Assembler::z_maeb(FloatRegister f1, FloatRegister f3, const Address& a) { z_maeb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_madb(FloatRegister f1, FloatRegister f3, const Address& a) { z_madb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_mseb(FloatRegister f1, FloatRegister f3, const Address& a) { z_mseb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+inline void Assembler::z_msdb(FloatRegister f1, FloatRegister f3, const Address& a) { z_msdb(f1, f3, a.disp(), a.indexOrR0(), a.baseOrR0()); }
+
+
+//---------------
// DIV
//---------------
inline void Assembler::z_debr( FloatRegister f1, FloatRegister f2) { emit_32( DEBR_ZOPC | fregt( f1, 24, 32) | freg( f2, 28, 32));}
--- a/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/c1_LIRAssembler_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -324,6 +324,22 @@
op->result_opr(),
op->info());
break;
+ case lir_fmad: {
+ const FloatRegister opr1 = op->in_opr1()->as_double_reg(),
+ opr2 = op->in_opr2()->as_double_reg(),
+ opr3 = op->in_opr3()->as_double_reg(),
+ res = op->result_opr()->as_double_reg();
+ __ z_madbr(opr3, opr1, opr2);
+ if (res != opr3) { __ z_ldr(res, opr3); }
+ } break;
+ case lir_fmaf: {
+ const FloatRegister opr1 = op->in_opr1()->as_float_reg(),
+ opr2 = op->in_opr2()->as_float_reg(),
+ opr3 = op->in_opr3()->as_float_reg(),
+ res = op->result_opr()->as_float_reg();
+ __ z_maebr(opr3, opr1, opr2);
+ if (res != opr3) { __ z_ler(res, opr3); }
+ } break;
default: ShouldNotReachHere(); break;
}
}
--- a/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/c1_LIRGenerator_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1237,7 +1237,28 @@
}
void LIRGenerator::do_FmaIntrinsic(Intrinsic* x) {
- fatal("FMA intrinsic is not implemented on this platform");
+ assert(x->number_of_arguments() == 3, "wrong type");
+ assert(UseFMA, "Needs FMA instructions support.");
+ LIRItem value(x->argument_at(0), this);
+ LIRItem value1(x->argument_at(1), this);
+ LIRItem value2(x->argument_at(2), this);
+
+ value2.set_destroys_register();
+
+ value.load_item();
+ value1.load_item();
+ value2.load_item();
+
+ LIR_Opr calc_input = value.result();
+ LIR_Opr calc_input1 = value1.result();
+ LIR_Opr calc_input2 = value2.result();
+ LIR_Opr calc_result = rlock_result(x);
+
+ switch (x->id()) {
+ case vmIntrinsics::_fmaD: __ fmad(calc_input, calc_input1, calc_input2, calc_result); break;
+ case vmIntrinsics::_fmaF: __ fmaf(calc_input, calc_input1, calc_input2, calc_result); break;
+ default: ShouldNotReachHere();
+ }
}
void LIRGenerator::do_vectorizedMismatch(Intrinsic* x) {
--- a/hotspot/src/cpu/s390/vm/s390.ad Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/s390.ad Wed Jul 05 22:38:24 2017 +0200
@@ -7249,6 +7249,171 @@
ins_pipe(pipe_class_dummy);
%}
+// Multiply-Accumulate
+// src1 * src2 + dst
+instruct maddF_reg_reg(regF dst, regF src1, regF src2) %{
+ match(Set dst (FmaF dst (Binary src1 src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MAEBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_reg_reg(regD dst, regD src1, regD src2) %{
+ match(Set dst (FmaD dst (Binary src1 src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MADBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_reg_reg(regF dst, regF src1, regF src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary src1 src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MSEBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msebr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_reg_reg(regD dst, regD src1, regD src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary src1 src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_REG_COST);
+ size(4);
+ format %{ "MSDBR $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdbr($dst$$FloatRegister, $src1$$FloatRegister, $src2$$FloatRegister);
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddF_reg_mem(regF dst, regF src1, memoryRX src2) %{
+ match(Set dst (FmaF dst (Binary src1 (LoadF src2))));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MAEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maeb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_reg_mem(regD dst, regD src1, memoryRX src2) %{
+ match(Set dst (FmaD dst (Binary src1 (LoadD src2))));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MADB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_reg_mem(regF dst, regF src1, memoryRX src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary src1 (LoadF src2))));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_mseb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_reg_mem(regD dst, regD src1, memoryRX src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary src1 (LoadD src2))));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSDB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdb($dst$$FloatRegister, $src1$$FloatRegister,
+ Address(reg_to_register_object($src2$$base), $src2$$index$$Register, $src2$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddF_mem_reg(regF dst, memoryRX src1, regF src2) %{
+ match(Set dst (FmaF dst (Binary (LoadF src1) src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MAEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_maeb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 + dst
+instruct maddD_mem_reg(regD dst, memoryRX src1, regD src2) %{
+ match(Set dst (FmaD dst (Binary (LoadD src1) src2)));
+ // CC unchanged by MUL-ADD.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MADB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_madb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubF_mem_reg(regF dst, memoryRX src1, regF src2) %{
+ match(Set dst (FmaF (NegF dst) (Binary (LoadF src1) src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSEB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_mseb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
+// src1 * src2 - dst
+instruct msubD_mem_reg(regD dst, memoryRX src1, regD src2) %{
+ match(Set dst (FmaD (NegD dst) (Binary (LoadD src1) src2)));
+ // CC unchanged by MUL-SUB.
+ ins_cost(ALU_MEMORY_COST);
+ size(6);
+ format %{ "MSDB $dst, $src1, $src2" %}
+ ins_encode %{
+ __ z_msdb($dst$$FloatRegister, $src2$$FloatRegister,
+ Address(reg_to_register_object($src1$$base), $src1$$index$$Register, $src1$$disp));
+ %}
+ ins_pipe(pipe_class_dummy);
+%}
+
// DIV
// Div float single precision
--- a/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/sharedRuntime_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -683,7 +683,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (ireg < z_num_iarg_registers) {
// Put long in register.
regs[i].set2(z_iarg_reg[ireg]);
@@ -723,7 +723,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < z_num_farg_registers) {
// Put double in register.
regs[i].set2(z_farg_reg[freg]);
@@ -822,7 +822,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (freg < z_num_farg_registers) {
regs[i].set2(z_farg_reg[freg]);
++freg;
--- a/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/stubGenerator_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -2038,15 +2038,15 @@
generate_push_parmBlk(keylen, fCode, parmBlk, key, cv, true);
// Prepare other registers for instruction.
- // __ z_lgr(src, from); // Not needed, registers are the same.
+ // __ z_lgr(src, from); // Not needed, registers are the same.
__ z_lgr(dst, to);
- __ z_lgr(srclen, msglen);
-
- __ kmc(dst, src); // Decipher the message.
+ __ z_llgfr(srclen, msglen); // We pass the offsets as ints, not as longs as required.
+
+ __ kmc(dst, src); // Decipher the message.
generate_pop_parmBlk(keylen, parmBlk, key, cv);
- __ z_lgr(Z_RET, msglen);
+ __ z_llgfr(Z_RET, msglen); // We pass the offsets as ints, not as longs as required.
__ z_br(Z_R14);
return __ addr_at(start_off);
--- a/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/templateInterpreterGenerator_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1297,36 +1297,96 @@
// Math function, frame manager must set up an interpreter state, etc.
address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::MethodKind kind) {
- if (!InlineIntrinsics) { return NULL; } // Generate a vanilla entry.
-
- // Only support absolute value and square root.
- if (kind != Interpreter::java_lang_math_abs && kind != Interpreter::java_lang_math_sqrt) {
- return NULL;
+ // Decide what to do: Use same platform specific instructions and runtime calls as compilers.
+ bool use_instruction = false;
+ address runtime_entry = NULL;
+ int num_args = 1;
+ bool double_precision = true;
+
+ // s390 specific:
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt:
+ case Interpreter::java_lang_math_abs: use_instruction = true; break;
+ case Interpreter::java_lang_math_fmaF:
+ case Interpreter::java_lang_math_fmaD: use_instruction = UseFMA; break;
+ default: break; // Fall back to runtime call.
+ }
+
+ switch (kind) {
+ case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
+ case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
+ case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
+ case Interpreter::java_lang_math_abs : /* run interpreted */ break;
+ case Interpreter::java_lang_math_sqrt : /* runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsqrt); not available */ break;
+ case Interpreter::java_lang_math_log : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog); break;
+ case Interpreter::java_lang_math_log10: runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dlog10); break;
+ case Interpreter::java_lang_math_pow : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dpow); num_args = 2; break;
+ case Interpreter::java_lang_math_exp : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dexp); break;
+ case Interpreter::java_lang_math_fmaF : /* run interpreted */ num_args = 3; double_precision = false; break;
+ case Interpreter::java_lang_math_fmaD : /* run interpreted */ num_args = 3; break;
+ default: ShouldNotReachHere();
}
- BLOCK_COMMENT("math_entry {");
-
- address math_entry = __ pc();
-
- if (kind == Interpreter::java_lang_math_abs) {
- // Load operand from stack.
- __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize));
- __ z_lpdbr(Z_FRET);
+ // Use normal entry if neither instruction nor runtime call is used.
+ if (!use_instruction && runtime_entry == NULL) return NULL;
+
+ address entry = __ pc();
+
+ if (use_instruction) {
+ switch (kind) {
+ case Interpreter::java_lang_math_sqrt:
+ // Can use memory operand directly.
+ __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp);
+ break;
+ case Interpreter::java_lang_math_abs:
+ // Load operand from stack.
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize));
+ __ z_lpdbr(Z_FRET);
+ break;
+ case Interpreter::java_lang_math_fmaF:
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3
+ __ mem2freg_opt(Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize)); // arg1
+ __ z_maeb(Z_FRET, Z_FARG2, Address(Z_esp, 2 * Interpreter::stackElementSize));
+ break;
+ case Interpreter::java_lang_math_fmaD:
+ __ mem2freg_opt(Z_FRET, Address(Z_esp, Interpreter::stackElementSize)); // result reg = arg3
+ __ mem2freg_opt(Z_FARG2, Address(Z_esp, 5 * Interpreter::stackElementSize)); // arg1
+ __ z_madb(Z_FRET, Z_FARG2, Address(Z_esp, 3 * Interpreter::stackElementSize));
+ break;
+ default: ShouldNotReachHere();
+ }
} else {
- // sqrt
- // Can use memory operand directly.
- __ z_sqdb(Z_FRET, Interpreter::stackElementSize, Z_esp);
+ // Load arguments
+ assert(num_args <= 4, "passed in registers");
+ if (double_precision) {
+ int offset = (2 * num_args - 1) * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset));
+ offset -= 2 * Interpreter::stackElementSize;
+ }
+ } else {
+ int offset = num_args * Interpreter::stackElementSize;
+ for (int i = 0; i < num_args; ++i) {
+ __ mem2freg_opt(as_FloatRegister(Z_FARG1->encoding() + 2 * i), Address(Z_esp, offset));
+ offset -= Interpreter::stackElementSize;
+ }
+ }
+ // Call runtime
+ __ save_return_pc(); // Save Z_R14.
+ __ push_frame_abi160(0); // Without new frame the RT call could overwrite the saved Z_R14.
+
+ __ call_VM_leaf(runtime_entry);
+
+ __ pop_frame();
+ __ restore_return_pc(); // Restore Z_R14.
}
- // Restore caller sp for c2i case.
+ // Pop c2i arguments (if any) off when we return.
__ resize_frame_absolute(Z_R10, Z_R0, true); // Cut the stack back to where the caller started.
- // We are done, return.
__ z_br(Z_R14);
- BLOCK_COMMENT("} math_entry");
-
- return math_entry;
+ return entry;
}
// Interpreter stub for calling a native method. (asm interpreter).
--- a/hotspot/src/cpu/s390/vm/vm_version_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/s390/vm/vm_version_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -155,9 +155,8 @@
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
}
- if (UseFMA) {
- warning("FMA instructions are not available on this CPU");
- FLAG_SET_DEFAULT(UseFMA, false);
+ if (FLAG_IS_DEFAULT(UseFMA)) {
+ FLAG_SET_DEFAULT(UseFMA, true);
}
// On z/Architecture, we take UseSHA as the general switch to enable/disable the SHA intrinsics.
--- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -425,7 +425,7 @@
#ifdef _LP64
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half");
// fall-through
case T_OBJECT:
case T_ARRAY:
@@ -441,7 +441,7 @@
break;
#else
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting VOID in other half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting VOID in other half");
// On 32-bit SPARC put longs always on the stack to keep the pressure off
// integer argument registers. They should be used for oops.
slot = round_to(slot, 2); // align
@@ -460,7 +460,7 @@
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
if (round_to(flt_reg, 2) + 1 < flt_reg_max) {
flt_reg = round_to(flt_reg, 2); // align
FloatRegister r = as_FloatRegister(flt_reg);
@@ -1174,7 +1174,7 @@
regs[i].set1(int_stk_helper(j));
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "expecting half");
case T_ADDRESS: // raw pointers, like current thread, for VM calls
case T_ARRAY:
case T_OBJECT:
@@ -1209,7 +1209,7 @@
break;
case T_DOUBLE:
{
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// V9ism: doubles go in EVEN/ODD regs and stack slots
int double_index = (j << 1);
param_array_reg.set2(VMRegImpl::stack2reg(double_index));
@@ -1261,7 +1261,7 @@
break;
case T_DOUBLE:
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
regs[i].set_pair(int_stk_helper(i + 1), int_stk_helper(i));
break;
case T_VOID: regs[i].set_bad(); break;
--- a/hotspot/src/cpu/x86/vm/globals_x86.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/globals_x86.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -63,9 +63,10 @@
#define MIN_STACK_RED_PAGES DEFAULT_STACK_RED_PAGES
#define MIN_STACK_RESERVED_PAGES (0)
-#ifdef AMD64
-// Very large C++ stack frames using solaris-amd64 optimized builds
-// due to lack of optimization caused by C++ compiler bugs
+#ifdef _LP64
+// Java_java_net_SocketOutputStream_socketWrite0() uses a 64k buffer on the
+// stack if compiled for unix and LP64. To pass stack overflow tests we need
+// 20 shadow pages.
#define DEFAULT_STACK_SHADOW_PAGES (NOT_WIN64(20) WIN64_ONLY(7) DEBUG_ONLY(+2))
// For those clients that do not use write socket, we allow
// the min range value to be below that of the default
@@ -73,7 +74,7 @@
#else
#define DEFAULT_STACK_SHADOW_PAGES (4 DEBUG_ONLY(+5))
#define MIN_STACK_SHADOW_PAGES DEFAULT_STACK_SHADOW_PAGES
-#endif // AMD64
+#endif // _LP64
define_pd_global(intx, StackYellowPages, DEFAULT_STACK_YELLOW_PAGES);
define_pd_global(intx, StackRedPages, DEFAULT_STACK_RED_PAGES);
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -478,12 +478,12 @@
}
break;
case T_LONG:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
regs[i].set2(VMRegImpl::stack2reg(dstack));
dstack += 2;
break;
case T_DOUBLE:
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
if( freg_arg0 == (uint)i ) {
regs[i].set2(xmm0->as_VMReg());
} else if( freg_arg1 == (uint)i ) {
@@ -1001,7 +1001,7 @@
case T_DOUBLE: // The stack numbering is reversed from Java
// Since C arguments do not get reversed, the ordering for
// doubles on the stack must be opposite the Java convention
- assert(sig_bt[i+1] == T_VOID, "missing Half" );
+ assert((i + 1) < total_args_passed && sig_bt[i+1] == T_VOID, "missing Half" );
regs[i].set2(VMRegImpl::stack2reg(stack));
stack += 2;
break;
--- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -474,7 +474,7 @@
regs[i].set_bad();
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -495,7 +495,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_j) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
} else {
@@ -1014,7 +1014,7 @@
}
break;
case T_LONG:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
// fall through
case T_OBJECT:
case T_ARRAY:
@@ -1045,7 +1045,7 @@
}
break;
case T_DOUBLE:
- assert(sig_bt[i + 1] == T_VOID, "expecting half");
+ assert((i + 1) < total_args_passed && sig_bt[i + 1] == T_VOID, "expecting half");
if (fp_args < Argument::n_float_register_parameters_c) {
regs[i].set2(FP_ArgReg[fp_args++]->as_VMReg());
#ifdef _WIN64
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -44,10 +44,14 @@
Type type = db.lookupType("ClassLoaderData");
classLoaderField = type.getOopField("_class_loader");
nextField = type.getAddressField("_next");
+ klassesField = type.getAddressField("_klasses");
+ isAnonymousField = new CIntField(type.getCIntegerField("_is_anonymous"), 0);
}
private static sun.jvm.hotspot.types.OopField classLoaderField;
private static AddressField nextField;
+ private static AddressField klassesField;
+ private static CIntField isAnonymousField;
public ClassLoaderData(Address addr) {
super(addr);
@@ -63,4 +67,16 @@
public Oop getClassLoader() {
return VM.getVM().getObjectHeap().newOop(classLoaderField.getValue(getAddress()));
}
+
+ public boolean getIsAnonymous() {
+ return isAnonymousField.getValue(this) != 0;
+ }
+
+ public ClassLoaderData next() {
+ return instantiateWrapperFor(nextField.getValue(getAddress()));
+ }
+
+ public Klass getKlasses() {
+ return (InstanceKlass)Metadata.instantiateWrapperFor(klassesField.getValue(getAddress()));
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+package sun.jvm.hotspot.classfile;
+
+import java.io.PrintStream;
+import java.util.*;
+import sun.jvm.hotspot.debugger.*;
+import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.oops.*;
+import sun.jvm.hotspot.types.*;
+
+public class ClassLoaderDataGraph {
+ static {
+ VM.registerVMInitializedObserver(new Observer() {
+ public void update(Observable o, Object data) {
+ initialize(VM.getVM().getTypeDataBase());
+ }
+ });
+ }
+
+ private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
+ Type type = db.lookupType("ClassLoaderDataGraph");
+
+ headField = type.getAddressField("_head");
+ }
+
+ private static AddressField headField;
+
+ public ClassLoaderData getClassLoaderGraphHead() {
+ return ClassLoaderData.instantiateWrapperFor(headField.getValue());
+ }
+
+ public static interface KlassVisitor {
+ public void visit(Klass k);
+ }
+
+ /** Iterate over all anonymous class loaders and the klasses in those */
+ public void allAnonymousKlassesDo(final KlassVisitor v) {
+ for (ClassLoaderData cl = getClassLoaderGraphHead();
+ cl != null;
+ cl = cl.next()) {
+ if (cl.getIsAnonymous() == true) {
+ for (Klass k = cl.getKlasses(); k != null; k = k.getNextLinkKlass()) {
+ v.visit(k);
+ }
+ }
+ }
+ }
+
+}
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/Klass.java Wed Jul 05 22:38:24 2017 +0200
@@ -61,6 +61,7 @@
}
subklass = new MetadataField(type.getAddressField("_subklass"), 0);
nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0);
+ nextLink = new MetadataField(type.getAddressField("_next_link"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue();
@@ -92,6 +93,7 @@
private static CIntField accessFlags;
private static MetadataField subklass;
private static MetadataField nextSibling;
+ private static MetadataField nextLink;
private static sun.jvm.hotspot.types.Field traceIDField;
private static CIntField vtableLen;
@@ -114,6 +116,7 @@
public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); }
public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); }
public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); }
+ public Klass getNextLinkKlass() { return (Klass) nextLink.getValue(this); }
public long getVtableLen() { return vtableLen.getValue(this); }
public long traceID() {
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/runtime/VM.java Wed Jul 05 22:38:24 2017 +0200
@@ -38,6 +38,7 @@
import sun.jvm.hotspot.types.*;
import sun.jvm.hotspot.utilities.*;
import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.classfile.*;
/** <P> This class encapsulates the global state of the VM; the
universe, object heap, interpreter, etc. It is a Singleton and
@@ -80,6 +81,7 @@
private SymbolTable symbols;
private StringTable strings;
private SystemDictionary dict;
+ private ClassLoaderDataGraph cldGraph;
private Threads threads;
private ObjectSynchronizer synchronizer;
private JNIHandles handles;
@@ -660,6 +662,13 @@
return dict;
}
+ public ClassLoaderDataGraph getClassLoaderDataGraph() {
+ if (cldGraph == null) {
+ cldGraph = new ClassLoaderDataGraph();
+ }
+ return cldGraph;
+ }
+
public Threads getThreads() {
if (threads == null) {
threads = new Threads();
--- a/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
@@ -31,6 +31,7 @@
import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
+import sun.jvm.hotspot.classfile.*;
/*
* This class writes Java heap in hprof binary format. This format is
@@ -379,6 +380,8 @@
private static final int JVM_SIGNATURE_ARRAY = '[';
private static final int JVM_SIGNATURE_CLASS = 'L';
+ int serialNum = 1;
+
public synchronized void write(String fileName) throws IOException {
// open file stream and create buffered data output stream
fos = new FileOutputStream(fileName);
@@ -516,6 +519,7 @@
private void writeClassDumpRecords() throws IOException {
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+ ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
try {
sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
public void visit(Klass k) {
@@ -528,6 +532,19 @@
}
}
});
+ // Add the anonymous classes also which are not present in the
+ // System Dictionary
+ cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() {
+ public void visit(Klass k) {
+ try {
+ writeHeapRecordPrologue();
+ writeClassDumpRecord(k);
+ writeHeapRecordEpilogue();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
} catch (RuntimeException re) {
handleRuntimeException(re);
}
@@ -799,17 +816,6 @@
writeObjectID(klass.getJavaMirror());
ClassData cd = (ClassData) classDataCache.get(klass);
- if (cd == null) {
- // The class is not present in the system dictionary, probably Lambda.
- // Add it to cache here
- if (klass instanceof InstanceKlass) {
- InstanceKlass ik = (InstanceKlass) klass;
- List fields = getInstanceFields(ik);
- int instSize = getSizeForFields(fields);
- cd = new ClassData(instSize, fields);
- classDataCache.put(ik, cd);
- }
- }
if (Assert.ASSERTS_ENABLED) {
Assert.that(cd != null, "can not get class data for " + klass.getName().asString() + klass.getAddress());
@@ -950,9 +956,24 @@
private void writeClasses() throws IOException {
// write class list (id, name) association
SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+ ClassLoaderDataGraph cldGraph = VM.getVM().getClassLoaderDataGraph();
try {
sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
- private int serialNum = 1;
+ public void visit(Klass k) {
+ try {
+ Instance clazz = k.getJavaMirror();
+ writeHeader(HPROF_LOAD_CLASS, 2 * (OBJ_ID_SIZE + 4));
+ out.writeInt(serialNum);
+ writeObjectID(clazz);
+ out.writeInt(DUMMY_STACK_TRACE_ID);
+ writeSymbolID(k.getName());
+ serialNum++;
+ } catch (IOException exp) {
+ throw new RuntimeException(exp);
+ }
+ }
+ });
+ cldGraph.allAnonymousKlassesDo(new ClassLoaderDataGraph.KlassVisitor() {
public void visit(Klass k) {
try {
Instance clazz = k.getJavaMirror();
--- a/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/jdk.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotBackend.java Wed Jul 05 22:38:24 2017 +0200
@@ -53,6 +53,7 @@
import org.graalvm.compiler.hotspot.stubs.Stub;
import org.graalvm.compiler.hotspot.stubs.UnwindExceptionToCallerStub;
import org.graalvm.compiler.hotspot.word.KlassPointer;
+import org.graalvm.compiler.hotspot.word.MethodCountersPointer;
import org.graalvm.compiler.lir.LIR;
import org.graalvm.compiler.lir.LIRFrameState;
import org.graalvm.compiler.lir.LIRInstruction;
@@ -316,8 +317,8 @@
/**
* Tiered support.
*/
- public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, Word.class);
- public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, Word.class, int.class, int.class);
+ public static final ForeignCallDescriptor INVOCATION_EVENT = new ForeignCallDescriptor("invocation_event", void.class, MethodCountersPointer.class);
+ public static final ForeignCallDescriptor BACKEDGE_EVENT = new ForeignCallDescriptor("backedge_event", void.class, MethodCountersPointer.class, int.class, int.class);
/**
* @see UncommonTrapCallNode
--- a/hotspot/src/os/aix/vm/os_aix.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -848,13 +848,13 @@
assert(thread->osthread() == NULL, "caller responsible");
- // Allocate the OSThread object
+ // Allocate the OSThread object.
OSThread* osthread = new OSThread(NULL, NULL);
if (osthread == NULL) {
return false;
}
- // set the correct thread state
+ // Set the correct thread state.
osthread->set_thread_type(thr_type);
// Initial state is ALLOCATED but not INITIALIZED
@@ -862,7 +862,7 @@
thread->set_osthread(osthread);
- // init thread attributes
+ // Init thread attributes.
pthread_attr_t attr;
pthread_attr_init(&attr);
guarantee(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0, "???");
@@ -871,15 +871,18 @@
if (os::Aix::on_aix()) {
guarantee(pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM) == 0, "???");
guarantee(pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) == 0, "???");
- } // end: aix
+ }
// Start in suspended state, and in os::thread_start, wake the thread up.
guarantee(pthread_attr_setsuspendstate_np(&attr, PTHREAD_CREATE_SUSPENDED_NP) == 0, "???");
- // calculate stack size if it's not specified by caller
+ // Calculate stack size if it's not specified by caller.
size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
pthread_attr_setstacksize(&attr, stack_size);
+ // Configure libc guard page.
+ pthread_attr_setguardsize(&attr, os::Aix::default_guard_size(thr_type));
+
pthread_t tid;
int ret = pthread_create(&tid, &attr, (void* (*)(void*)) thread_native_entry, thread);
@@ -895,7 +898,7 @@
pthread_attr_destroy(&attr);
if (ret != 0) {
- // Need to clean up stuff we've allocated so far
+ // Need to clean up stuff we've allocated so far.
thread->set_osthread(NULL);
delete osthread;
return false;
@@ -3032,6 +3035,19 @@
return chained;
}
+size_t os::Aix::default_guard_size(os::ThreadType thr_type) {
+ // Creating guard page is very expensive. Java thread has HotSpot
+ // guard pages, only enable glibc guard page for non-Java threads.
+ // (Remember: compiler thread is a Java thread, too!)
+ //
+ // Aix can have different page sizes for stack (4K) and heap (64K).
+ // As Hotspot knows only one page size, we assume the stack has
+ // the same page size as the heap. Returning page_size() here can
+ // cause 16 guard pages which we want to avoid. Thus we return 4K
+ // which will be rounded to the real page size by the OS.
+ return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : 4 * K);
+}
+
struct sigaction* os::Aix::get_preinstalled_handler(int sig) {
if (sigismember(&sigs, sig)) {
return &sigact[sig];
--- a/hotspot/src/os/aix/vm/os_aix.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os/aix/vm/os_aix.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -140,6 +140,9 @@
// libpthread version string
static void libpthread_init();
+ // Return default libc guard size for the specified thread type.
+ static size_t default_guard_size(os::ThreadType thr_type);
+
// Function returns true if we run on OS/400 (pase), false if we run
// on AIX.
static bool on_pase() {
--- a/hotspot/src/os/linux/vm/os_linux.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -716,11 +716,18 @@
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- // calculate stack size if it's not specified by caller
+ // Calculate stack size if it's not specified by caller.
size_t stack_size = os::Posix::get_initial_stack_size(thr_type, req_stack_size);
+ // In the Linux NPTL pthread implementation the guard size mechanism
+ // is not implemented properly. The posix standard requires adding
+ // the size of the guard pages to the stack size, instead Linux
+ // takes the space out of 'stacksize'. Thus we adapt the requested
+ // stack_size by the size of the guard pages to mimick proper
+ // behaviour.
+ stack_size = align_size_up(stack_size + os::Linux::default_guard_size(thr_type), vm_page_size());
pthread_attr_setstacksize(&attr, stack_size);
- // glibc guard page
+ // Configure glibc guard page.
pthread_attr_setguardsize(&attr, os::Linux::default_guard_size(thr_type));
ThreadState state;
@@ -920,9 +927,21 @@
// Locate initial thread stack. This special handling of initial thread stack
// is needed because pthread_getattr_np() on most (all?) Linux distros returns
-// bogus value for initial thread.
+// bogus value for the primordial process thread. While the launcher has created
+// the VM in a new thread since JDK 6, we still have to allow for the use of the
+// JNI invocation API from a primordial thread.
void os::Linux::capture_initial_stack(size_t max_size) {
- // stack size is the easy part, get it from RLIMIT_STACK
+
+ // max_size is either 0 (which means accept OS default for thread stacks) or
+ // a user-specified value known to be at least the minimum needed. If we
+ // are actually on the primordial thread we can make it appear that we have a
+ // smaller max_size stack by inserting the guard pages at that location. But we
+ // cannot do anything to emulate a larger stack than what has been provided by
+ // the OS or threading library. In fact if we try to use a stack greater than
+ // what is set by rlimit then we will crash the hosting process.
+
+ // Maximum stack size is the easy part, get it from RLIMIT_STACK.
+ // If this is "unlimited" then it will be a huge value.
struct rlimit rlim;
getrlimit(RLIMIT_STACK, &rlim);
size_t stack_size = rlim.rlim_cur;
@@ -932,17 +951,6 @@
// so we won't install guard page on ld.so's data section.
stack_size -= 2 * page_size();
- // 4441425: avoid crash with "unlimited" stack size on SuSE 7.1 or Redhat
- // 7.1, in both cases we will get 2G in return value.
- // 4466587: glibc 2.2.x compiled w/o "--enable-kernel=2.4.0" (RH 7.0,
- // SuSE 7.2, Debian) can not handle alternate signal stack correctly
- // for initial thread if its stack size exceeds 6M. Cap it at 2M,
- // in case other parts in glibc still assumes 2M max stack size.
- // FIXME: alt signal stack is gone, maybe we can relax this constraint?
- // Problem still exists RH7.2 (IA64 anyway) but 2MB is a little small
- if (stack_size > 2 * K * K IA64_ONLY(*2)) {
- stack_size = 2 * K * K IA64_ONLY(*2);
- }
// Try to figure out where the stack base (top) is. This is harder.
//
// When an application is started, glibc saves the initial stack pointer in
@@ -1102,14 +1110,29 @@
// stack_top could be partially down the page so align it
stack_top = align_size_up(stack_top, page_size());
- if (max_size && stack_size > max_size) {
- _initial_thread_stack_size = max_size;
+ // Allowed stack value is minimum of max_size and what we derived from rlimit
+ if (max_size > 0) {
+ _initial_thread_stack_size = MIN2(max_size, stack_size);
} else {
- _initial_thread_stack_size = stack_size;
- }
-
+ // Accept the rlimit max, but if stack is unlimited then it will be huge, so
+ // clamp it at 8MB as we do on Solaris
+ _initial_thread_stack_size = MIN2(stack_size, 8*M);
+ }
_initial_thread_stack_size = align_size_down(_initial_thread_stack_size, page_size());
_initial_thread_stack_bottom = (address)stack_top - _initial_thread_stack_size;
+
+ assert(_initial_thread_stack_bottom < (address)stack_top, "overflow!");
+
+ if (log_is_enabled(Info, os, thread)) {
+ // See if we seem to be on primordial process thread
+ bool primordial = uintptr_t(&rlim) > uintptr_t(_initial_thread_stack_bottom) &&
+ uintptr_t(&rlim) < stack_top;
+
+ log_info(os, thread)("Capturing initial stack in %s thread: req. size: " SIZE_FORMAT "K, actual size: "
+ SIZE_FORMAT "K, top=" INTPTR_FORMAT ", bottom=" INTPTR_FORMAT,
+ primordial ? "primordial" : "user", max_size / K, _initial_thread_stack_size / K,
+ stack_top, intptr_t(_initial_thread_stack_bottom));
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -2833,6 +2856,13 @@
return false;
}
+size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
+ // Creating guard page is very expensive. Java thread has HotSpot
+ // guard pages, only enable glibc guard page for non-Java threads.
+ // (Remember: compiler thread is a Java thread, too!)
+ return ((thr_type == java_thread || thr_type == compiler_thread) ? 0 : page_size());
+}
+
// rebuild_cpu_to_node_map() constructs a table mapping cpud id to node id.
// The table is later used in get_node_by_cpu().
void os::Linux::rebuild_cpu_to_node_map() {
@@ -6065,6 +6095,101 @@
return yes;
}
+
+// Java/Compiler thread:
+//
+// Low memory addresses
+// P0 +------------------------+
+// | |\ Java thread created by VM does not have glibc
+// | glibc guard page | - guard page, attached Java thread usually has
+// | |/ 1 glibc guard page.
+// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
+// | |\
+// | HotSpot Guard Pages | - red, yellow and reserved pages
+// | |/
+// +------------------------+ JavaThread::stack_reserved_zone_base()
+// | |\
+// | Normal Stack | -
+// | |/
+// P2 +------------------------+ Thread::stack_base()
+//
+// Non-Java thread:
+//
+// Low memory addresses
+// P0 +------------------------+
+// | |\
+// | glibc guard page | - usually 1 page
+// | |/
+// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
+// | |\
+// | Normal Stack | -
+// | |/
+// P2 +------------------------+ Thread::stack_base()
+//
+// ** P1 (aka bottom) and size (P2 = P1 - size) are the address and stack size
+// returned from pthread_attr_getstack().
+// ** Due to NPTL implementation error, linux takes the glibc guard page out
+// of the stack size given in pthread_attr. We work around this for
+// threads created by the VM. (We adapt bottom to be P1 and size accordingly.)
+//
+#ifndef ZERO
+static void current_stack_region(address * bottom, size_t * size) {
+ if (os::Linux::is_initial_thread()) {
+ // initial thread needs special handling because pthread_getattr_np()
+ // may return bogus value.
+ *bottom = os::Linux::initial_thread_stack_bottom();
+ *size = os::Linux::initial_thread_stack_size();
+ } else {
+ pthread_attr_t attr;
+
+ int rslt = pthread_getattr_np(pthread_self(), &attr);
+
+ // JVM needs to know exact stack location, abort if it fails
+ if (rslt != 0) {
+ if (rslt == ENOMEM) {
+ vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
+ } else {
+ fatal("pthread_getattr_np failed with error = %d", rslt);
+ }
+ }
+
+ if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
+ fatal("Cannot locate current stack attributes!");
+ }
+
+ // Work around NPTL stack guard error.
+ size_t guard_size = 0;
+ rslt = pthread_attr_getguardsize(&attr, &guard_size);
+ if (rslt != 0) {
+ fatal("pthread_attr_getguardsize failed with error = %d", rslt);
+ }
+ *bottom += guard_size;
+ *size -= guard_size;
+
+ pthread_attr_destroy(&attr);
+
+ }
+ assert(os::current_stack_pointer() >= *bottom &&
+ os::current_stack_pointer() < *bottom + *size, "just checking");
+}
+
+address os::current_stack_base() {
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return (bottom + size);
+}
+
+size_t os::current_stack_size() {
+ // This stack size includes the usable stack and HotSpot guard pages
+ // (for the threads that have Hotspot guard pages).
+ address bottom;
+ size_t size;
+ current_stack_region(&bottom, &size);
+ return size;
+}
+#endif
+
static inline struct timespec get_mtime(const char* filename) {
struct stat st;
int ret = os::stat(filename, &st);
--- a/hotspot/src/os/posix/vm/os_posix.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os/posix/vm/os_posix.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1096,6 +1096,8 @@
int detachstate = 0;
pthread_attr_getstacksize(attr, &stack_size);
pthread_attr_getguardsize(attr, &guard_size);
+ // Work around linux NPTL implementation error, see also os::create_thread() in os_linux.cpp.
+ LINUX_ONLY(stack_size -= guard_size);
pthread_attr_getdetachstate(attr, &detachstate);
jio_snprintf(buf, buflen, "stacksize: " SIZE_FORMAT "k, guardsize: " SIZE_FORMAT "k, %s",
stack_size / 1024, guard_size / 1024,
@@ -1105,14 +1107,18 @@
// Check minimum allowable stack sizes for thread creation and to initialize
// the java system classes, including StackOverflowError - depends on page
-// size. Add two 4K pages for compiler2 recursion in main thread.
-// Add in 4*BytesPerWord 4K pages to account for VM stack during
-// class initialization depending on 32 or 64 bit VM.
+// size.
+// The space needed for frames during startup is platform dependent. It
+// depends on word size, platform calling conventions, C frame layout and
+// interpreter/C1/C2 design decisions. Therefore this is given in a
+// platform (os/cpu) dependent constant.
+// To this, space for guard mechanisms is added, which depends on the
+// page size which again depends on the concrete system the VM is running
+// on. Space for libc guard pages is not included in this size.
jint os::Posix::set_minimum_stack_sizes() {
- _java_thread_min_stack_allowed = MAX2(_java_thread_min_stack_allowed,
- JavaThread::stack_guard_zone_size() +
- JavaThread::stack_shadow_zone_size() +
- (4 * BytesPerWord COMPILER2_PRESENT(+ 2)) * 4 * K);
+ _java_thread_min_stack_allowed = _java_thread_min_stack_allowed +
+ JavaThread::stack_guard_zone_size() +
+ JavaThread::stack_shadow_zone_size();
_java_thread_min_stack_allowed = align_size_up(_java_thread_min_stack_allowed, vm_page_size());
@@ -1128,28 +1134,14 @@
return JNI_ERR;
}
-#ifdef SOLARIS
- // For 64kbps there will be a 64kb page size, which makes
- // the usable default stack size quite a bit less. Increase the
- // stack for 64kb (or any > than 8kb) pages, this increases
- // virtual memory fragmentation (since we're not creating the
- // stack on a power of 2 boundary. The real fix for this
- // should be to fix the guard page mechanism.
-
- if (vm_page_size() > 8*K) {
- stack_size_in_bytes = (stack_size_in_bytes != 0)
- ? stack_size_in_bytes +
- JavaThread::stack_red_zone_size() +
- JavaThread::stack_yellow_zone_size()
- : 0;
- ThreadStackSize = stack_size_in_bytes/K;
- }
-#endif // SOLARIS
-
// Make the stack size a multiple of the page size so that
// the yellow/red zones can be guarded.
- JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes,
- vm_page_size()));
+ JavaThread::set_stack_size_at_create(round_to(stack_size_in_bytes, vm_page_size()));
+
+ // Reminder: a compiler thread is a Java thread.
+ _compiler_thread_min_stack_allowed = _compiler_thread_min_stack_allowed +
+ JavaThread::stack_guard_zone_size() +
+ JavaThread::stack_shadow_zone_size();
_compiler_thread_min_stack_allowed = align_size_up(_compiler_thread_min_stack_allowed, vm_page_size());
--- a/hotspot/src/os/posix/vm/os_posix.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os/posix/vm/os_posix.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -43,7 +43,11 @@
static void print_load_average(outputStream* st);
// Minimum stack size a thread can be created with (allowing
- // the VM to completely create the thread and enter user code)
+ // the VM to completely create the thread and enter user code).
+ // The initial values exclude any guard pages (by HotSpot or libc).
+ // set_minimum_stack_sizes() will add the size required for
+ // HotSpot guard pages depending on page size and flag settings.
+ // Libc guard pages are never considered by these values.
static size_t _compiler_thread_min_stack_allowed;
static size_t _java_thread_min_stack_allowed;
static size_t _vm_internal_thread_min_stack_allowed;
--- a/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/aix_ppc/vm/os_aix_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -535,13 +535,15 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 192 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1 * M);
return s;
}
--- a/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -839,19 +839,20 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 48 * K;
+#ifdef _LP64
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
+#endif // _LP64
+#ifndef AMD64
#ifdef __GNUC__
#define GET_GS() ({int gs; __asm__ volatile("movw %%gs, %w0":"=q"(gs)); gs&0xffff;})
#endif
-
#endif // AMD64
// return default stack size for thr_type
@@ -870,14 +871,14 @@
//
// Low memory addresses
// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
+// | |\ Java thread created by VM does not have glibc
// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
+// | |/ 1 glibc guard page.
// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
// | |\
-// | HotSpot Guard Pages | - red and yellow pages
+// | HotSpot Guard Pages | - red, yellow and reserved pages
// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
+// +------------------------+ JavaThread::stack_reserved_zone_base()
// | |\
// | Normal Stack | -
// | |/
@@ -925,7 +926,7 @@
int rslt = pthread_stackseg_np(pthread_self(), &ss);
if (rslt != 0)
- fatal("pthread_stackseg_np failed with err = %d", rslt);
+ fatal("pthread_stackseg_np failed with error = %d", rslt);
*bottom = (address)((char *)ss.ss_sp - ss.ss_size);
*size = ss.ss_size;
@@ -936,12 +937,12 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0)
- fatal("pthread_attr_init failed with err = %d", rslt);
+ fatal("pthread_attr_init failed with error = %d", rslt);
rslt = pthread_attr_get_np(pthread_self(), &attr);
if (rslt != 0)
- fatal("pthread_attr_get_np failed with err = %d", rslt);
+ fatal("pthread_attr_get_np failed with error = %d", rslt);
if (pthread_attr_getstackaddr(&attr, (void **)bottom) != 0 ||
pthread_attr_getstacksize(&attr, size) != 0) {
--- a/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -310,7 +310,7 @@
int rslt = pthread_stackseg_np(pthread_self(), &ss);
if (rslt != 0)
- fatal("pthread_stackseg_np failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_stackseg_np failed with error = " INT32_FORMAT, rslt);
stack_top = (address) ss.ss_sp;
stack_bytes = ss.ss_size;
@@ -322,12 +322,12 @@
// JVM needs to know exact stack location, abort if it fails
if (rslt != 0)
- fatal("pthread_attr_init failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_attr_init failed with error = " INT32_FORMAT, rslt);
rslt = pthread_attr_get_np(pthread_self(), &attr);
if (rslt != 0)
- fatal("pthread_attr_get_np failed with err = " INT32_FORMAT, rslt);
+ fatal("pthread_attr_get_np failed with error = " INT32_FORMAT, rslt);
if (pthread_attr_getstackaddr(&attr, (void **) &stack_bottom) != 0 ||
pthread_attr_getstacksize(&attr, &stack_bytes) != 0) {
--- a/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -473,8 +473,10 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 32 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
// return default stack size for thr_type
@@ -484,91 +486,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
@@ -606,8 +523,10 @@
st->print(" TRAPNO=" INTPTR_FORMAT, uc->uc_mcontext.gregs[REG_TRAPNO]);
st->cr();
#else
- for (int r = 0; r < 31; r++)
- st->print_cr( "R%d=" INTPTR_FORMAT, r, (size_t)uc->uc_mcontext.regs[r]);
+ for (int r = 0; r < 31; r++) {
+ st->print("R%-2d=", r);
+ print_location(st, uc->uc_mcontext.regs[r]);
+ }
#endif
st->cr();
--- a/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_arm/vm/os_linux_arm.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -526,8 +526,10 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K;
+size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
// return default stack size for thr_type
@@ -537,91 +539,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed");
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
--- a/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_ppc/vm/os_linux_ppc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -535,100 +535,19 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K);
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- return 2 * page_size();
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
--- a/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_s390/vm/os_linux_s390.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -473,103 +473,19 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = (52 DEBUG_ONLY(+ 32)) * K;
+size_t os::Posix::_java_thread_min_stack_allowed = (32 DEBUG_ONLY(+ 8)) * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 32 * K;
-// return default stack size for thr_type
+// Return default stack size for thr_type.
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
- // default stack size (compiler thread needs larger stack)
+ // Default stack size (compiler thread needs larger stack).
size_t s = (thr_type == os::compiler_thread ? 4 * M : 1024 * K);
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // z/Architecture: put 2 guard pages right in the middle of thread stack. This value
- // should be consistent with the value used by register stack handling code.
- return 2 * page_size();
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - Right in the middle of stack, 2 pages
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - Right in the middle of stack, 2 pages
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P2 is the address returned from pthread_attr_getstackaddr(), P2 - P1
-// is the stack size returned by pthread_attr_getstacksize().
-
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // Initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
--- a/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -156,51 +156,6 @@
return (address)sp;
}
-static void current_stack_region(address* bottom, size_t* size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void**)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return bottom + size;
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
char* os::non_memory_address_word() {
// Must never look like an address returned by reserve_memory,
// even in its subfields (as defined by the CPU immediate fields,
@@ -726,8 +681,10 @@
///////////////////////////////////////////////////////////////////////////////
// thread stack
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
// return default stack size for thr_type
@@ -737,12 +694,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
#ifndef PRODUCT
void os::verify_stack_alignment() {
}
--- a/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_x86/vm/os_linux_x86.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -677,15 +677,15 @@
////////////////////////////////////////////////////////////////////////////////
// thread stack
-#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 48 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 40 * K;
+#ifdef _LP64
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-size_t os::Posix::_java_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = (48 DEBUG_ONLY(+ 4)) * K;
-#endif // AMD64
+#endif // _LP64
// return default stack size for thr_type
size_t os::Posix::default_stack_size(os::ThreadType thr_type) {
@@ -698,91 +698,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Creating guard page is very expensive. Java thread has HotSpot
- // guard page, only enable glibc guard page for non-Java threads.
- return (thr_type == java_thread ? 0 : page_size());
-}
-
-// Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\ JavaThread created by VM does not have glibc
-// | glibc guard page | - guard, attached Java thread usually has
-// | |/ 1 page glibc guard.
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | HotSpot Guard Pages | - red and yellow pages
-// | |/
-// +------------------------+ JavaThread::stack_yellow_zone_base()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// Non-Java thread:
-//
-// Low memory addresses
-// +------------------------+
-// | |\
-// | glibc guard page | - usually 1 page
-// | |/
-// P1 +------------------------+ Thread::stack_base() - Thread::stack_size()
-// | |\
-// | Normal Stack | -
-// | |/
-// P2 +------------------------+ Thread::stack_base()
-//
-// ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from
-// pthread_attr_getstack()
-
-static void current_stack_region(address * bottom, size_t * size) {
- if (os::Linux::is_initial_thread()) {
- // initial thread needs special handling because pthread_getattr_np()
- // may return bogus value.
- *bottom = os::Linux::initial_thread_stack_bottom();
- *size = os::Linux::initial_thread_stack_size();
- } else {
- pthread_attr_t attr;
-
- int rslt = pthread_getattr_np(pthread_self(), &attr);
-
- // JVM needs to know exact stack location, abort if it fails
- if (rslt != 0) {
- if (rslt == ENOMEM) {
- vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
- } else {
- fatal("pthread_getattr_np failed with errno = %d", rslt);
- }
- }
-
- if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) {
- fatal("Can not locate current stack attributes!");
- }
-
- pthread_attr_destroy(&attr);
-
- }
- assert(os::current_stack_pointer() >= *bottom &&
- os::current_stack_pointer() < *bottom + *size, "just checking");
-}
-
-address os::current_stack_base() {
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return (bottom + size);
-}
-
-size_t os::current_stack_size() {
- // stack size includes normal stack and HotSpot guard pages
- address bottom;
- size_t size;
- current_stack_region(&bottom, &size);
- return size;
-}
-
/////////////////////////////////////////////////////////////////////////////
// helper functions for fatal error handler
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -320,12 +320,6 @@
return s;
}
-size_t os::Linux::default_guard_size(os::ThreadType thr_type) {
- // Only enable glibc guard pages for non-Java threads
- // (Java threads have HotSpot guard pages)
- return (thr_type == java_thread ? 0 : page_size());
-}
-
static void current_stack_region(address *bottom, size_t *size) {
pthread_attr_t attr;
int res = pthread_getattr_np(pthread_self(), &attr);
@@ -334,7 +328,7 @@
vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np");
}
else {
- fatal("pthread_getattr_np failed with errno = %d", res);
+ fatal("pthread_getattr_np failed with error = %d", res);
}
}
@@ -342,7 +336,7 @@
size_t stack_bytes;
res = pthread_attr_getstack(&attr, (void **) &stack_bottom, &stack_bytes);
if (res != 0) {
- fatal("pthread_attr_getstack failed with errno = %d", res);
+ fatal("pthread_attr_getstack failed with error = %d", res);
}
address stack_top = stack_bottom + stack_bytes;
--- a/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -81,15 +81,13 @@
#define MAX_PATH (2 * K)
-// Minimum stack size for the VM. It's easier to document a constant
-// but it's different for x86 and sparc because the page sizes are different.
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+size_t os::Posix::_compiler_thread_min_stack_allowed = 104 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 86 * K;
#ifdef _LP64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 128 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 128 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 128 * K;
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = 96 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 96 * K;
size_t os::Posix::_vm_internal_thread_min_stack_allowed = 96 * K;
#endif
--- a/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -86,19 +86,23 @@
#define MAX_PATH (2 * K)
-// Minimum stack sizes for the VM. It's easier to document a constant value
-// but it's different for x86 and sparc because the page sizes are different.
+// Minimum usable stack sizes required to get to user code. Space for
+// HotSpot guard pages is added later.
+#ifdef _LP64
+size_t os::Posix::_compiler_thread_min_stack_allowed = 202 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 48 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K;
+#else
+size_t os::Posix::_compiler_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_java_thread_min_stack_allowed = 32 * K;
+size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
+#endif // _LP64
+
#ifdef AMD64
-size_t os::Posix::_compiler_thread_min_stack_allowed = 394 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 224 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 224 * K;
#define REG_SP REG_RSP
#define REG_PC REG_RIP
#define REG_FP REG_RBP
#else
-size_t os::Posix::_compiler_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_java_thread_min_stack_allowed = 64 * K;
-size_t os::Posix::_vm_internal_thread_min_stack_allowed = 64 * K;
#define REG_SP UESP
#define REG_PC EIP
#define REG_FP EBP
--- a/hotspot/src/share/vm/c1/c1_LIR.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/c1/c1_LIR.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -677,9 +677,7 @@
// LIR_Op3
case lir_idiv:
- case lir_irem:
- case lir_fmad:
- case lir_fmaf: {
+ case lir_irem: {
assert(op->as_Op3() != NULL, "must be");
LIR_Op3* op3= (LIR_Op3*)op;
@@ -697,6 +695,17 @@
break;
}
+ case lir_fmad:
+ case lir_fmaf: {
+ assert(op->as_Op3() != NULL, "must be");
+ LIR_Op3* op3= (LIR_Op3*)op;
+ assert(op3->_info == NULL, "no info");
+ do_input(op3->_opr1);
+ do_input(op3->_opr2);
+ do_input(op3->_opr3);
+ do_output(op3->_result);
+ break;
+ }
// LIR_OpJavaCall
case lir_static_call:
--- a/hotspot/src/share/vm/classfile/classLoader.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -84,7 +84,6 @@
typedef jzentry* (JNICALL *GetNextEntry_t)(jzfile *zip, jint n);
typedef jboolean (JNICALL *ZipInflateFully_t)(void *inBuf, jlong inLen, void *outBuf, jlong outLen, char **pmsg);
typedef jint (JNICALL *Crc32_t)(jint crc, const jbyte *buf, jint len);
-typedef void (JNICALL *FreeEntry_t)(jzfile *zip, jzentry *entry);
static ZipOpen_t ZipOpen = NULL;
static ZipClose_t ZipClose = NULL;
@@ -94,7 +93,6 @@
static canonicalize_fn_t CanonicalizeEntry = NULL;
static ZipInflateFully_t ZipInflateFully = NULL;
static Crc32_t Crc32 = NULL;
-static FreeEntry_t FreeEntry = NULL;
// Entry points for jimage.dll for loading jimage file entries
@@ -150,7 +148,6 @@
GrowableArray<char*>* ClassLoader::_boot_modules_array = NULL;
GrowableArray<char*>* ClassLoader::_platform_modules_array = NULL;
SharedPathsMiscInfo* ClassLoader::_shared_paths_misc_info = NULL;
-int ClassLoader::_num_patch_mod_prefixes = 0;
#endif
// helper routines
@@ -320,20 +317,6 @@
FREE_C_HEAP_ARRAY(char, _zip_name);
}
-bool ClassPathZipEntry::stream_exists(const char* name) {
- // enable call to C land
- JavaThread* thread = JavaThread::current();
- ThreadToNativeFromVM ttn(thread);
- // check whether zip archive contains name
- jint name_len, filesize;
- jzentry* entry = (*FindEntry)(_zip, name, &filesize, &name_len);
- if (entry != NULL) {
- (*FreeEntry)(_zip, entry);
- return true;
- }
- return false;
-}
-
u1* ClassPathZipEntry::open_entry(const char* name, jint* filesize, bool nul_terminate, TRAPS) {
// enable call to C land
JavaThread* thread = JavaThread::current();
@@ -1090,7 +1073,6 @@
GetNextEntry = CAST_TO_FN_PTR(GetNextEntry_t, os::dll_lookup(handle, "ZIP_GetNextEntry"));
ZipInflateFully = CAST_TO_FN_PTR(ZipInflateFully_t, os::dll_lookup(handle, "ZIP_InflateFully"));
Crc32 = CAST_TO_FN_PTR(Crc32_t, os::dll_lookup(handle, "ZIP_CRC32"));
- FreeEntry = CAST_TO_FN_PTR(FreeEntry_t, os::dll_lookup(handle, "ZIP_FreeEntry"));
// ZIP_Close is not exported on Windows in JDK5.0 so don't abort if ZIP_Close is NULL
if (ZipOpen == NULL || FindEntry == NULL || ReadEntry == NULL ||
@@ -1418,57 +1400,6 @@
return NULL;
}
-#if INCLUDE_CDS
-// The following function is only used during CDS dump time.
-// It checks if a class can be found in the jar entries of the _patch_mod_entries.
-// It does not support non-jar entries.
-bool ClassLoader::is_in_patch_module(const char* const file_name) {
- assert(DumpSharedSpaces, "dump time only");
- if (_patch_mod_entries == NULL) {
- return false;
- }
-
- int num_of_entries = _patch_mod_entries->length();
- char* class_module_name = NULL;
- ResourceMark rm;
- const char *pkg_name = package_from_name(file_name);
- // Using the jimage to obtain the class' module name.
- // The ModuleEntryTable cannot be used at this point during dump time
- // because the module system hasn't been initialized yet.
- if (pkg_name != NULL) {
- JImageFile *jimage = _jrt_entry->jimage();
- class_module_name = (char*)(*JImagePackageToModule)(jimage, pkg_name);
- }
-
- if (class_module_name == NULL) {
- return false;
- }
-
- // Loop through all the patch module entries looking for module
- for (int i = 0; i < num_of_entries; i++) {
- ModuleClassPathList* module_cpl = _patch_mod_entries->at(i);
- Symbol* module_cpl_name = module_cpl->module_name();
-
- if (strcmp(module_cpl_name->as_C_string(), class_module_name) == 0) {
- // Class' module has been located, attempt to locate
- // the class from the module's ClassPathEntry list.
- ClassPathEntry* e = module_cpl->module_first_entry();
- while (e != NULL) {
- if (e->is_jar_file()) {
- if (e->stream_exists(file_name)) {
- return true;
- } else {
- e = e->next();
- }
- }
- }
- }
- }
-
- return false;
-}
-#endif // INCLUDE_CDS
-
instanceKlassHandle ClassLoader::load_class(Symbol* name, bool search_append_only, TRAPS) {
assert(name != NULL, "invariant");
assert(THREAD->is_Java_thread(), "must be a JavaThread");
@@ -1494,8 +1425,6 @@
// If DumpSharedSpaces is true boot loader visibility boundaries are set to:
// - [jimage] + [_first_append_entry to _last_append_entry] (all path entries).
- // If a class is found in the --patch-module entries, the class will not be included in the
- // CDS archive. Also, CDS is not supported if exploded module builds are used.
//
// If search_append_only is true, boot loader visibility boundaries are
// set to be _first_append_entry to the end. This includes:
@@ -1519,15 +1448,13 @@
// Note: The --patch-module entries are never searched if the boot loader's
// visibility boundary is limited to only searching the append entries.
if (_patch_mod_entries != NULL && !search_append_only) {
+ // At CDS dump time, the --patch-module entries are ignored. That means a
+ // class is still loaded from the runtime image even if it might
+ // appear in the _patch_mod_entries. The runtime shared class visibility
+ // check will determine if a shared class is visible based on the runtime
+ // environemnt, including the runtime --patch-module setting.
if (!DumpSharedSpaces) {
stream = search_module_entries(_patch_mod_entries, class_name, file_name, CHECK_NULL);
- } else {
-#if INCLUDE_CDS
- if (is_in_patch_module(file_name)) {
- tty->print_cr("Preload Warning: Skip archiving class %s found in --patch-module entry", class_name);
- return NULL;
- }
-#endif
}
}
@@ -1679,57 +1606,8 @@
}
#if INCLUDE_CDS
-// Capture all the --patch-module entries specified during CDS dump time.
-// It also captures the non-existing path(s) and the required file(s) during inspecting
-// the entries.
-void ClassLoader::setup_patch_mod_path() {
- assert(DumpSharedSpaces, "only used with -Xshare:dump");
- ResourceMark rm;
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- int num_of_entries = patch_mod_args->length();
- for (int i = 0; i < num_of_entries; i++) {
- const char* module_name = (patch_mod_args->at(i))->module_name();
- const char* module_path = (patch_mod_args->at(i))->path_string();
- int path_len = (int)strlen(module_path);
- int name_len = (int)strlen(module_name);
- int buf_len = name_len + path_len + 2; // add 2 for the '=' and NULL terminator
- int end = 0;
- char* buf = NEW_C_HEAP_ARRAY(char, buf_len, mtInternal);
- // Iterate over the module's class path entries
- for (int start = 0; start < path_len; start = end) {
- while (module_path[end] && module_path[end] != os::path_separator()[0]) {
- end++;
- }
- strncpy(buf, &module_path[start], end - start);
- buf[end - start] = '\0';
- struct stat st;
- if (os::stat(buf, &st) != 0) {
- // File not found
- _shared_paths_misc_info->add_nonexist_path(buf);
- } else {
- if ((st.st_mode & S_IFMT) != S_IFREG) { // is not a regular file
- vm_exit_during_initialization(
- "--patch-module requires a regular file during dumping", buf);
- } else {
- _shared_paths_misc_info->add_required_file(buf);
- }
- }
- while (module_path[end] == os::path_separator()[0]) {
- end++;
- }
- };
- jio_snprintf(buf, buf_len, "%s=%s", module_name, module_path);
- _shared_paths_misc_info->add_patch_mod_classpath((const char*)buf);
- _num_patch_mod_prefixes++;
- FREE_C_HEAP_ARRAY(char, buf);
- }
- }
-}
-
void ClassLoader::initialize_shared_path() {
if (DumpSharedSpaces) {
- setup_patch_mod_path();
ClassLoaderExt::setup_search_paths();
_shared_paths_misc_info->write_jint(0); // see comments in SharedPathsMiscInfo::check()
}
--- a/hotspot/src/share/vm/classfile/classLoader.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/classLoader.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -69,7 +69,6 @@
// Attempt to locate file_name through this class path entry.
// Returns a class file parsing stream if successfull.
virtual ClassFileStream* open_stream(const char* name, TRAPS) = 0;
- virtual bool stream_exists(const char* name) = 0;
// Debugging
NOT_PRODUCT(virtual void compile_the_world(Handle loader, TRAPS) = 0;)
};
@@ -84,7 +83,6 @@
JImageFile* jimage() const { return NULL; }
ClassPathDirEntry(const char* dir);
ClassFileStream* open_stream(const char* name, TRAPS);
- bool stream_exists(const char* name) { return false; }
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
};
@@ -128,7 +126,6 @@
ClassFileStream* open_stream(const char* name, TRAPS);
void contents_do(void f(const char* name, void* context), void* context);
bool is_multiple_versioned(TRAPS) NOT_CDS_RETURN_(false);
- bool stream_exists(const char* name);
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
};
@@ -148,7 +145,6 @@
ClassPathImageEntry(JImageFile* jimage, const char* name);
~ClassPathImageEntry();
ClassFileStream* open_stream(const char* name, TRAPS);
- bool stream_exists(const char* name) { return false; }
// Debugging
NOT_PRODUCT(void compile_the_world(Handle loader, TRAPS);)
@@ -259,7 +255,6 @@
// Info used by CDS
CDS_ONLY(static SharedPathsMiscInfo * _shared_paths_misc_info;)
- CDS_ONLY(static int _num_patch_mod_prefixes;)
// Initialization:
// - setup the boot loader's system class path
@@ -434,9 +429,6 @@
static void initialize_module_loader_map(JImageFile* jimage);
static s2 classloader_type(Symbol* class_name, ClassPathEntry* e,
int classpath_index, TRAPS);
- static bool is_in_patch_module(const char* const file_name);
- static void setup_patch_mod_path(); // Only when -Xshare:dump
- static int num_patch_mod_prefixes() { return _num_patch_mod_prefixes; }
#endif
static void trace_class_path(const char* msg, const char* name = NULL);
--- a/hotspot/src/share/vm/classfile/moduleEntry.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/moduleEntry.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -108,6 +108,18 @@
}
MutexLocker m1(Module_lock);
+ // This is a guard against possible race between agent threads that redefine
+ // or retransform classes in this module. Only one of them is adding the
+ // default read edges to the unnamed modules of the boot and app class loaders
+ // with an upcall to jdk.internal.module.Modules.transformedByAgent.
+ // At the same time, another thread can instrument the module classes by
+ // injecting dependencies that require the default read edges for resolution.
+ if (this->has_default_read_edges() && !m->is_named()) {
+ ClassLoaderData* cld = m->loader_data();
+ if (cld->is_the_null_class_loader_data() || cld->is_system_class_loader_data()) {
+ return true; // default read edge
+ }
+ }
if (!has_reads()) {
return false;
} else {
--- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -86,9 +86,6 @@
case REQUIRED:
out->print("Expecting that file %s must exist and is not altered", path);
break;
- case PATCH_MOD:
- out->print("Expecting --patch-module=%s", path);
- break;
default:
ShouldNotReachHere();
}
@@ -167,26 +164,6 @@
}
}
break;
- case PATCH_MOD:
- {
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- int num_of_entries = patch_mod_args->length();
- for (int i = 0; i < num_of_entries; i++) {
- const char* module_name = (patch_mod_args->at(i))->module_name();
- const char* path_string = (patch_mod_args->at(i))->path_string();
- size_t n = strlen(module_name);
- // path contains the module name, followed by '=', and one or more entries.
- // E.g.: "java.base=foo" or "java.naming=dir1:dir2:dir3"
- if ((strncmp(module_name, path, n) != 0) ||
- (path[n] != '=') ||
- (strcmp(path + n + 1, path_string) != 0)) {
- return fail("--patch-module mismatch, path not found in run time: ", path);
- }
- }
- }
- }
- break;
default:
return fail("Corrupted archive file header");
}
--- a/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/sharedPathsMiscInfo.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -104,28 +104,10 @@
add_path(path, NON_EXIST);
}
- // The path must exist and have required size and modification time
- void add_required_file(const char* path) {
- add_path(path, REQUIRED);
-
- struct stat st;
- if (os::stat(path, &st) != 0) {
- assert(0, "sanity");
-#if INCLUDE_CDS
- ClassLoader::exit_with_path_failure("failed to os::stat(%s)", path); // should not happen
-#endif
- }
- write_time(st.st_mtime);
- write_long(st.st_size);
- }
-
// The path must exist, and must contain exactly <num_entries> files/dirs
void add_boot_classpath(const char* path) {
add_path(path, BOOT);
}
- void add_patch_mod_classpath(const char* path) {
- add_path(path, PATCH_MOD);
- }
int write_jint(jint num) {
write(&num, sizeof(num));
return 0;
@@ -147,8 +129,7 @@
enum {
BOOT = 1,
NON_EXIST = 2,
- REQUIRED = 3,
- PATCH_MOD = 4
+ REQUIRED = 3
};
virtual const char* type_name(int type) {
@@ -156,7 +137,6 @@
case BOOT: return "BOOT";
case NON_EXIST: return "NON_EXIST";
case REQUIRED: return "REQUIRED";
- case PATCH_MOD: return "PATCH_MOD";
default: ShouldNotReachHere(); return "?";
}
}
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1231,6 +1231,8 @@
bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
instanceKlassHandle ik,
Handle class_loader, TRAPS) {
+ assert(!ModuleEntryTable::javabase_moduleEntry()->is_patched(),
+ "Cannot use sharing if java.base is patched");
ResourceMark rm;
int path_index = ik->shared_classpath_index();
SharedClassPathEntry* ent =
@@ -1258,6 +1260,12 @@
}
}
+ // If the archived class is from a module that has been patched at runtime,
+ // the class cannot be loaded from the archive.
+ if (mod_entry != NULL && mod_entry->is_patched()) {
+ return false;
+ }
+
if (class_loader.is_null()) {
assert(ent != NULL, "Shared class for NULL classloader must have valid SharedClassPathEntry");
// The NULL classloader can load archived class originated from the
--- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -299,10 +299,6 @@
}
static void initialize_method_handle_entries();
-
- // PPC-only: Support abs and sqrt like in compiler.
- // For others we can use a normal (native) entry.
- static bool math_entry_available(MethodKind kind);
};
//------------------------------------------------------------------------------------------------------------------------
--- a/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/interpreter/cppInterpreterGenerator.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -57,6 +57,8 @@
method_entry(java_lang_math_log10 );
method_entry(java_lang_math_pow );
method_entry(java_lang_math_exp );
+ method_entry(java_lang_math_fmaD );
+ method_entry(java_lang_math_fmaF );
method_entry(java_lang_ref_reference_get);
AbstractInterpreter::initialize_method_handle_entries();
@@ -95,7 +97,9 @@
case Interpreter::java_lang_math_log10 : // fall thru
case Interpreter::java_lang_math_sqrt : // fall thru
case Interpreter::java_lang_math_pow : // fall thru
- case Interpreter::java_lang_math_exp : entry_point = generate_math_entry(kind); break;
+ case Interpreter::java_lang_math_exp : // fall thru
+ case Interpreter::java_lang_math_fmaD : // fall thru
+ case Interpreter::java_lang_math_fmaF : entry_point = generate_math_entry(kind); break;
case Interpreter::java_lang_ref_reference_get
: entry_point = generate_Reference_get_entry(); break;
default:
--- a/hotspot/src/share/vm/interpreter/rewriter.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/interpreter/rewriter.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -426,15 +426,16 @@
Symbol* field_sig = cp->signature_ref_at(bc_index);
fieldDescriptor fd;
- klass->find_field(field_name, field_sig, &fd);
- if (fd.access_flags().is_final()) {
- if (fd.access_flags().is_static()) {
- if (!method->is_static_initializer()) {
- fd.set_has_initialized_final_update(true);
- }
- } else {
- if (!method->is_object_initializer()) {
- fd.set_has_initialized_final_update(true);
+ if (klass->find_field(field_name, field_sig, &fd) != NULL) {
+ if (fd.access_flags().is_final()) {
+ if (fd.access_flags().is_static()) {
+ if (!method->is_static_initializer()) {
+ fd.set_has_initialized_final_update(true);
+ }
+ } else {
+ if (!method->is_object_initializer()) {
+ fd.set_has_initialized_final_update(true);
+ }
}
}
}
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -967,7 +967,7 @@
return objects;
}
-void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) {
+void CodeInstaller::record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS) {
Handle position = DebugInfo::bytecodePosition(debug_info);
if (position.is_null()) {
// Stubs do not record scope info, just oop maps
@@ -980,10 +980,10 @@
} else {
objectMapping = NULL;
}
- record_scope(pc_offset, position, scope_mode, objectMapping, CHECK);
+ record_scope(pc_offset, position, scope_mode, objectMapping, return_oop, CHECK);
}
-void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, TRAPS) {
+void CodeInstaller::record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, bool return_oop, TRAPS) {
Handle frame;
if (scope_mode == CodeInstaller::FullFrame) {
if (!position->is_a(BytecodeFrame::klass())) {
@@ -993,7 +993,7 @@
}
Handle caller_frame = BytecodePosition::caller(position);
if (caller_frame.not_null()) {
- record_scope(pc_offset, caller_frame, scope_mode, objects, CHECK);
+ record_scope(pc_offset, caller_frame, scope_mode, objects, return_oop, CHECK);
}
Handle hotspot_method = BytecodePosition::method(position);
@@ -1083,7 +1083,7 @@
throw_exception = BytecodeFrame::rethrowException(frame) == JNI_TRUE;
}
- _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, false,
+ _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, return_oop,
locals_token, expressions_token, monitors_token);
}
@@ -1139,7 +1139,10 @@
if (debug_info.not_null()) {
OopMap *map = create_oop_map(debug_info, CHECK);
_debug_recorder->add_safepoint(next_pc_offset, map);
- record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, CHECK);
+
+ bool return_oop = hotspot_method.not_null() && getMethodFromHotSpotMethod(hotspot_method())->is_returning_oop();
+
+ record_scope(next_pc_offset, debug_info, CodeInstaller::FullFrame, return_oop, CHECK);
}
if (foreign_call.not_null()) {
--- a/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/jvmci/jvmciCodeInstaller.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -254,8 +254,11 @@
FullFrame
};
- void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS);
- void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, TRAPS);
+ void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, bool return_oop, TRAPS);
+ void record_scope(jint pc_offset, Handle debug_info, ScopeMode scope_mode, TRAPS) {
+ record_scope(pc_offset, debug_info, scope_mode, false /* return_oop */, THREAD);
+ }
+ void record_scope(jint pc_offset, Handle position, ScopeMode scope_mode, GrowableArray<ScopeValue*>* objects, bool return_oop, TRAPS);
void record_object_value(ObjectValue* sv, Handle value, GrowableArray<ScopeValue*>* objects, TRAPS);
GrowableArray<ScopeValue*>* record_virtual_objects(Handle debug_info, TRAPS);
--- a/hotspot/src/share/vm/logging/logFileStreamOutput.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/logging/logFileStreamOutput.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -29,11 +29,17 @@
#include "memory/allocation.inline.hpp"
static bool initialized;
-static char stdoutmem[sizeof(LogStdoutOutput)];
-static char stderrmem[sizeof(LogStderrOutput)];
+static union {
+ char stdoutmem[sizeof(LogStdoutOutput)];
+ jlong dummy;
+} aligned_stdoutmem;
+static union {
+ char stderrmem[sizeof(LogStderrOutput)];
+ jlong dummy;
+} aligned_stderrmem;
-LogStdoutOutput &StdoutLog = reinterpret_cast<LogStdoutOutput&>(stdoutmem);
-LogStderrOutput &StderrLog = reinterpret_cast<LogStderrOutput&>(stderrmem);
+LogStdoutOutput &StdoutLog = reinterpret_cast<LogStdoutOutput&>(aligned_stdoutmem.stdoutmem);
+LogStderrOutput &StderrLog = reinterpret_cast<LogStderrOutput&>(aligned_stderrmem.stderrmem);
LogFileStreamInitializer::LogFileStreamInitializer() {
if (!initialized) {
--- a/hotspot/src/share/vm/memory/filemap.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/memory/filemap.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -179,7 +179,6 @@
_classpath_entry_table_size = mapinfo->_classpath_entry_table_size;
_classpath_entry_table = mapinfo->_classpath_entry_table;
_classpath_entry_size = mapinfo->_classpath_entry_size;
- _num_patch_mod_prefixes = ClassLoader::num_patch_mod_prefixes();
// The following fields are for sanity checks for whether this archive
// will function correctly with this JVM and the bootclasspath it's
@@ -948,23 +947,6 @@
return false;
}
- // Check if there is a mismatch in --patch-module entry counts between dump time and run time.
- // More checks will be performed on individual --patch-module entry in the
- // SharedPathsMiscInfo::check() function.
- GrowableArray<ModulePatchPath*>* patch_mod_args = Arguments::get_patch_mod_prefix();
- if (patch_mod_args != NULL) {
- if (_num_patch_mod_prefixes == 0) {
- FileMapInfo::fail_stop("--patch-module found in run time but none was specified in dump time");
- }
- if (patch_mod_args->length() != _num_patch_mod_prefixes) {
- FileMapInfo::fail_stop("mismatched --patch-module entry counts between dump time and run time");
- }
- } else {
- if (_num_patch_mod_prefixes > 0) {
- FileMapInfo::fail_stop("--patch-module specified in dump time but none was specified in run time");
- }
- }
-
return true;
}
--- a/hotspot/src/share/vm/memory/filemap.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/memory/filemap.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -155,7 +155,6 @@
// loading failures during runtime.
int _classpath_entry_table_size;
size_t _classpath_entry_size;
- int _num_patch_mod_prefixes; // number of --patch-module entries
SharedClassPathEntry* _classpath_entry_table;
char* region_addr(int idx);
--- a/hotspot/src/share/vm/opto/runtime.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/opto/runtime.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -59,7 +59,6 @@
#include "opto/mulnode.hpp"
#include "opto/runtime.hpp"
#include "opto/subnode.hpp"
-#include "prims/jvmtiThreadState.hpp"
#include "runtime/atomic.hpp"
#include "runtime/fprofiler.hpp"
#include "runtime/handles.inline.hpp"
@@ -1458,11 +1457,6 @@
}
#endif
- JvmtiThreadState *state = thread->jvmti_thread_state();
- if (state != NULL) {
- state->set_exception_detected();
- }
-
thread->set_vm_result(exception);
// Frame not compiled (handles deoptimization blob)
return SharedRuntime::raw_exception_handler_for_return_address(thread, ret_pc);
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -130,15 +130,15 @@
private:
JavaThread *_thread;
JNIEnv* _jni_env;
- bool _exception_detected;
- bool _exception_caught;
+ JvmtiThreadState::ExceptionState _saved_exception_state;
#if 0
JNIHandleBlock* _hblock;
#endif
public:
JvmtiEventMark(JavaThread *thread) : _thread(thread),
- _jni_env(thread->jni_environment()) {
+ _jni_env(thread->jni_environment()),
+ _saved_exception_state(JvmtiThreadState::ES_CLEARED) {
#if 0
_hblock = thread->active_handles();
_hblock->clear_thoroughly(); // so we can be safe
@@ -149,11 +149,7 @@
// we are before an event.
// Save current jvmti thread exception state.
if (state != NULL) {
- _exception_detected = state->is_exception_detected();
- _exception_caught = state->is_exception_caught();
- } else {
- _exception_detected = false;
- _exception_caught = false;
+ _saved_exception_state = state->get_exception_state();
}
JNIHandleBlock* old_handles = thread->active_handles();
@@ -186,12 +182,7 @@
// we are continuing after an event.
if (state != NULL) {
// Restore the jvmti thread exception state.
- if (_exception_detected) {
- state->set_exception_detected();
- }
- if (_exception_caught) {
- state->set_exception_caught();
- }
+ state->restore_exception_state(_saved_exception_state);
}
}
@@ -1552,7 +1543,6 @@
}
}
-
void JvmtiExport::post_exception_throw(JavaThread *thread, Method* method, address location, oop exception) {
HandleMark hm(thread);
methodHandle mh(thread, method);
@@ -2454,7 +2444,7 @@
JvmtiThreadState* state = thread->jvmti_thread_state();
if (state != NULL) {
- state->clear_exception_detected();
+ state->clear_exception_state();
}
}
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -50,8 +50,7 @@
: _thread_event_enable() {
assert(JvmtiThreadState_lock->is_locked(), "sanity check");
_thread = thread;
- _exception_detected = false;
- _exception_caught = false;
+ _exception_state = ES_CLEARED;
_debuggable = true;
_hide_single_stepping = false;
_hide_level = 0;
@@ -310,7 +309,7 @@
// an exception.
//
if (is_exception_detected()) {
- clear_exception_detected();
+ clear_exception_state();
}
// If step is pending for popframe then it may not be
// a repeat step. The new_bci and method_id is same as current_bci
@@ -385,7 +384,7 @@
// an exception.
//
if (is_exception_detected()) {
- clear_exception_detected();
+ clear_exception_state();
}
// If step is pending for earlyret then it may not be a repeat step.
// The new_bci and method_id is same as current_bci and current
--- a/hotspot/src/share/vm/prims/jvmtiThreadState.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/prims/jvmtiThreadState.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -76,13 +76,21 @@
private:
friend class JvmtiEnv;
JavaThread *_thread;
- bool _exception_detected;
- bool _exception_caught;
bool _hide_single_stepping;
bool _pending_step_for_popframe;
bool _pending_step_for_earlyret;
int _hide_level;
+ public:
+ enum ExceptionState {
+ ES_CLEARED,
+ ES_DETECTED,
+ ES_CAUGHT
+ };
+
+ private:
+ ExceptionState _exception_state;
+
// Used to send class being redefined/retransformed and kind of transform
// info to the class file load hook event handler.
KlassHandle *_class_being_redefined;
@@ -161,16 +169,18 @@
int count_frames();
inline JavaThread *get_thread() { return _thread; }
- inline bool is_exception_detected() { return _exception_detected; }
- inline bool is_exception_caught() { return _exception_caught; }
- inline void set_exception_detected() { _exception_detected = true;
- _exception_caught = false; }
- inline void clear_exception_detected() {
- _exception_detected = false;
- assert(_exception_caught == false, "_exception_caught is out of phase");
- }
- inline void set_exception_caught() { _exception_caught = true;
- _exception_detected = false; }
+
+ inline bool is_exception_detected() { return _exception_state == ES_DETECTED; }
+ inline bool is_exception_caught() { return _exception_state == ES_CAUGHT; }
+
+ inline void set_exception_detected() { _exception_state = ES_DETECTED; }
+ inline void set_exception_caught() { _exception_state = ES_CAUGHT; }
+
+ inline void clear_exception_state() { _exception_state = ES_CLEARED; }
+
+ // We need to save and restore exception state inside JvmtiEventMark
+ inline ExceptionState get_exception_state() { return _exception_state; }
+ inline void restore_exception_state(ExceptionState state) { _exception_state = state; }
inline void clear_hide_single_stepping() {
if (_hide_level > 0) {
--- a/hotspot/src/share/vm/runtime/arguments.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -1323,26 +1323,32 @@
"jdk.module.limitmods",
"jdk.module.path",
"jdk.module.upgrade.path",
- "jdk.module.addmods.0" };
- const char* unsupported_options[] = { "-m",
- "--limit-modules",
- "--module-path",
- "--upgrade-module-path",
- "--add-modules" };
+ "jdk.module.addmods.0",
+ "jdk.module.patch.0" };
+ const char* unsupported_options[] = { "-m", // cannot use at dump time
+ "--limit-modules", // ignored at dump time
+ "--module-path", // ignored at dump time
+ "--upgrade-module-path", // ignored at dump time
+ "--add-modules", // ignored at dump time
+ "--patch-module" // ignored at dump time
+ };
assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be");
- // If a vm option is found in the unsupported_options array with index less than the warning_idx,
- // vm will exit with an error message. Otherwise, it will result in a warning message.
- uint warning_idx = 2;
+ // If a vm option is found in the unsupported_options array with index less than the info_idx,
+ // vm will exit with an error message. Otherwise, it will print an informational message if
+ // PrintSharedSpaces is enabled.
+ uint info_idx = 1;
SystemProperty* sp = system_properties();
while (sp != NULL) {
for (uint i = 0; i < ARRAY_SIZE(unsupported_properties); i++) {
if (strcmp(sp->key(), unsupported_properties[i]) == 0) {
- if (i < warning_idx) {
+ if (i < info_idx) {
vm_exit_during_initialization(
"Cannot use the following option when dumping the shared archive", unsupported_options[i]);
} else {
- warning(
- "the %s option is ignored when dumping the shared archive", unsupported_options[i]);
+ if (PrintSharedSpaces) {
+ tty->print_cr(
+ "Info: the %s option is ignored when dumping the shared archive", unsupported_options[i]);
+ }
}
}
}
@@ -1419,10 +1425,8 @@
}
}
-#if defined(COMPILER2) || INCLUDE_JVMCI || defined(_LP64) || !INCLUDE_CDS
// Conflict: required to use shared spaces (-Xshare:on), but
// incompatible command line options were chosen.
-
static void no_shared_spaces(const char* message) {
if (RequireSharedSpaces) {
jio_fprintf(defaultStream::error_stream(),
@@ -1432,7 +1436,6 @@
FLAG_SET_DEFAULT(UseSharedSpaces, false);
}
}
-#endif
// Returns threshold scaled with the value of scale.
// If scale < 0.0, threshold is returned without scaling.
@@ -2680,6 +2683,12 @@
return result;
}
+#if INCLUDE_CDS
+ if (UseSharedSpaces && patch_mod_javabase) {
+ no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched.");
+ }
+#endif
+
return JNI_OK;
}
@@ -4408,7 +4417,6 @@
}
jint Arguments::apply_ergo() {
-
// Set flags based on ergonomics.
set_ergonomics_flags();
--- a/hotspot/src/share/vm/runtime/os.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/runtime/os.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -436,7 +436,7 @@
vm_thread,
cgc_thread, // Concurrent GC thread
pgc_thread, // Parallel GC thread
- java_thread,
+ java_thread, // Java, CodeCacheSweeper, JVMTIAgent and Service threads.
compiler_thread,
watcher_thread,
os_thread
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -288,7 +288,8 @@
nonstatic_field(Klass, _access_flags, AccessFlags) \
nonstatic_field(Klass, _prototype_header, markOop) \
nonstatic_field(Klass, _next_sibling, Klass*) \
- nonstatic_field(Klass, _vtable_len, int) \
+ nonstatic_field(Klass, _next_link, Klass*) \
+ nonstatic_field(Klass, _vtable_len, int) \
nonstatic_field(vtableEntry, _method, Method*) \
nonstatic_field(MethodData, _size, int) \
nonstatic_field(MethodData, _method, Method*) \
@@ -712,6 +713,8 @@
\
nonstatic_field(ClassLoaderData, _class_loader, oop) \
nonstatic_field(ClassLoaderData, _next, ClassLoaderData*) \
+ volatile_nonstatic_field(ClassLoaderData, _klasses, Klass*) \
+ nonstatic_field(ClassLoaderData, _is_anonymous, bool) \
\
static_field(ClassLoaderDataGraph, _head, ClassLoaderData*) \
\
--- a/hotspot/test/ProblemList.txt Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/ProblemList.txt Wed Jul 05 22:38:24 2017 +0200
@@ -71,7 +71,6 @@
# :hotspot_serviceability
-serviceability/dcmd/jvmti/LoadAgentDcmdTest.java 8150318 generic-all
serviceability/jdwp/AllModulesCommandTest.java 8168478 generic-all
serviceability/sa/sadebugd/SADebugDTest.java 8163805 generic-all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/c2/Test7005594.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7005594
+ * @summary Array overflow not handled correctly with loop optimzations
+ *
+ * @run main/othervm -Xcomp
+ -XX:CompileOnly=compiler.c2.Test7005594::test
+ compiler.c2.Test7005594
+ */
+
+package compiler.c2;
+
+public class Test7005594 {
+ static int test(byte a[]){
+ int result = 0;
+ for (int i = 1; i < a.length; i += Integer.MAX_VALUE) {
+ result += a[i];
+ }
+ return result;
+ }
+
+ public static void main(String [] args){
+ try {
+ int result = test(new byte[2]);
+ throw new AssertionError("Expected ArrayIndexOutOfBoundsException was not thrown");
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println("Expected " + e + " was thrown");
+ }
+ }
+}
--- a/hotspot/test/compiler/c2/cr7005594/Test7005594.java Thu Dec 22 18:48:23 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2011, 2014, 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
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/**
- * @test
- * @bug 7005594
- * @summary Array overflow not handled correctly with loop optimzations
- *
- * @run shell Test7005594.sh
- */
-
-package compiler.c2.cr7005594;
-
-public class Test7005594 {
-
- static int test(byte a[]){
- int result=0;
- for( int i=0; i<a.length; i+=((0x7fffffff>>1)+1) ){
- result += a[i];
- }
- return result;
- }
-
- public static void main(String [] args){
- byte a[]=new byte[(0x7fffffff>>1)+2];
- int result = 0;
- try {
- result = test(a);
- } catch (ArrayIndexOutOfBoundsException e) {
- e.printStackTrace(System.out);
- System.out.println("Passed");
- System.exit(95);
- }
- System.out.println(result);
- System.out.println("FAILED");
- System.exit(97);
- }
-
-}
-
--- a/hotspot/test/compiler/c2/cr7005594/Test7005594.sh Thu Dec 22 18:48:23 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,111 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2011, 2014, 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
-# under the terms of the GNU General Public License version 2 only, as
-# published by the Free Software Foundation.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-#
-## some tests require path to find test source dir
-if [ "${TESTSRC}" = "" ]
-then
- TESTSRC=${PWD}
- echo "TESTSRC not set. Using "${TESTSRC}" as default"
-fi
-echo "TESTSRC=${TESTSRC}"
-## Adding common setup Variables for running shell tests.
-. ${TESTSRC}/../../../test_env.sh
-
-# Amount of physical memory in megabytes
-MEM=0
-if [ -f "/proc/meminfo" ]; then
- # Linux, Windows/Cygwin
- MEM=`cat /proc/meminfo |grep ^MemTotal: | awk '{print $2}'`
- MEM="$(($MEM / 1024))"
-elif [ -x "/usr/sbin/prtconf" ]; then
- # Solaris
- MEM=`/usr/sbin/prtconf | grep "^Memory size" | awk '{print $3}'`
-elif [ -x "/usr/sbin/system_profiler" ]; then
- # MacOS
- MEMo=`/usr/sbin/system_profiler SPHardwareDataType | grep Memory:`
- MEM=`echo "$MEMo" | awk '{print $2}'`
- MEMu=`echo "$MEMo" | awk '{print $3}'`
- case $MEMu in
- GB)
- MEM="$(($MEM * 1024))"
- ;;
- MB)
- ;;
- *)
- echo "Unknown memory unit in system_profile output: $MEMu"
- ;;
- esac
-elif [ -n "$ROOTDIR" -a -x "$ROOTDIR/mksnt/sysinf" ]; then
- # Windows/MKS
- MEM=`"$ROOTDIR/mksnt/sysinf" memory -v | grep "Total Physical Memory: " | sed 's/Total Physical Memory: *//g'`
- MEM="$(($machine_memory / 1024))"
-else
- echo "Unable to determine amount of physical memory on the machine"
-fi
-
-if [ $MEM -lt 2000 ]; then
- echo "Test skipped due to low (or unknown) memory on the system: $MEM Mb"
- exit 0
-fi
-
-echo "MEMORY=$MEM Mb"
-
-set -x
-
-cp ${TESTSRC}/Test7005594.java .
-cp ${TESTSRC}/Test7005594.sh .
-
-${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} -d . Test7005594.java
-
-${TESTJAVA}/bin/java ${TESTOPTS} -Xmx1600m -Xms1600m -XX:+IgnoreUnrecognizedVMOptions \
- -XX:-ZapUnusedHeapArea -Xcomp -XX:CompileCommand=quiet \
- -XX:CompileOnly=compiler.c2.cr7005594.Test7005594::test \
- compiler.c2.cr7005594.Test7005594 > test.out 2>&1
-
-result=$?
-
-cat test.out
-
-if [ $result -eq 95 ]
-then
- echo "Passed"
- exit 0
-fi
-
-if [ $result -eq 97 ]
-then
- echo "Failed"
- exit 1
-fi
-
-# The test should pass when no enough space for object heap
-grep "Could not reserve enough space for .*object heap" test.out
-if [ $? = 0 ]
-then
- echo "Passed"
- exit 0
-else
- echo "Failed"
- exit 1
-fi
--- a/hotspot/test/compiler/ciReplay/CiReplayBase.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/compiler/ciReplay/CiReplayBase.java Wed Jul 05 22:38:24 2017 +0200
@@ -215,7 +215,7 @@
try(BufferedReader br = new BufferedReader(new FileReader(REPLAY_FILE_NAME))) {
return br.lines()
.filter(s -> s.startsWith("compile "))
- .map(s -> s.substring(s.lastIndexOf(' ') + 1))
+ .map(s -> s.split("\\s+")[5])
.map(Integer::parseInt)
.findAny()
.get();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/floatingpoint/TestFMABrokenC1RegAlloc.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2016, Red Hat, Inc. 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8171092
+ * @summary C1's Math.fma() intrinsic doesn't correctly marks its inputs
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestFMABrokenC1RegAlloc
+ *
+ */
+
+public class TestFMABrokenC1RegAlloc {
+
+ double dummy0;
+ double dummy1;
+ double dummy2;
+ double dummy3;
+ double dummy4;
+ double dummy5;
+ double dummy6;
+ double dummy7;
+ double dummy8;
+ double dummy9;
+ double dummy10;
+ double dummy11;
+ double dummy12;
+ double dummy13;
+ double dummy14;
+ double dummy15;
+ double dummy16;
+ double dummy17;
+ double dummy18;
+ double dummy19;
+ double dummy20;
+ double dummy21;
+ double dummy22;
+ double dummy23;
+ double dummy24;
+ double dummy25;
+ double dummy26;
+ double dummy27;
+ double dummy28;
+ double dummy29;
+ double dummy30;
+ double dummy31;
+ double dummy32;
+ double dummy33;
+ double dummy34;
+ double dummy35;
+ double dummy36;
+ double dummy37;
+ double dummy38;
+ double dummy39;
+
+ double test(double a, double b, double c) {
+ double dummy0 = this.dummy0;
+ double dummy1 = this.dummy1;
+ double dummy2 = this.dummy2;
+ double dummy3 = this.dummy3;
+ double dummy4 = this.dummy4;
+ double dummy5 = this.dummy5;
+ double dummy6 = this.dummy6;
+ double dummy7 = this.dummy7;
+ double dummy8 = this.dummy8;
+ double dummy9 = this.dummy9;
+ double dummy10 = this.dummy10;
+ double dummy11 = this.dummy11;
+ double dummy12 = this.dummy12;
+ double dummy13 = this.dummy13;
+ double dummy14 = this.dummy14;
+ double dummy15 = this.dummy15;
+ double dummy16 = this.dummy16;
+ double dummy17 = this.dummy17;
+ double dummy18 = this.dummy18;
+ double dummy19 = this.dummy19;
+ double dummy20 = this.dummy20;
+ double dummy21 = this.dummy21;
+ double dummy22 = this.dummy22;
+ double dummy23 = this.dummy23;
+ double dummy24 = this.dummy24;
+ double dummy25 = this.dummy25;
+ double dummy26 = this.dummy26;
+ double dummy27 = this.dummy27;
+ double dummy28 = this.dummy28;
+ double dummy29 = this.dummy29;
+ double dummy30 = this.dummy30;
+ double dummy31 = this.dummy31;
+ double dummy32 = this.dummy32;
+ double dummy33 = this.dummy33;
+ double dummy34 = this.dummy34;
+ double dummy35 = this.dummy35;
+ double dummy36 = this.dummy36;
+ double dummy37 = this.dummy37;
+ double dummy38 = this.dummy38;
+ double dummy39 = this.dummy39;
+ return Math.fma(a, b, c) +
+ dummy0 +
+ dummy1 +
+ dummy2 +
+ dummy3 +
+ dummy4 +
+ dummy5 +
+ dummy6 +
+ dummy7 +
+ dummy8 +
+ dummy9 +
+ dummy10 +
+ dummy11 +
+ dummy12 +
+ dummy13 +
+ dummy14 +
+ dummy15 +
+ dummy16 +
+ dummy17 +
+ dummy18 +
+ dummy19 +
+ dummy20 +
+ dummy21 +
+ dummy22 +
+ dummy23 +
+ dummy24 +
+ dummy25 +
+ dummy26 +
+ dummy27 +
+ dummy28 +
+ dummy29 +
+ dummy30 +
+ dummy31 +
+ dummy32 +
+ dummy33 +
+ dummy34 +
+ dummy35 +
+ dummy36 +
+ dummy37 +
+ dummy38 +
+ dummy39;
+ }
+
+ static public void main(String[] args) {
+ TestFMABrokenC1RegAlloc t = new TestFMABrokenC1RegAlloc();
+ for (int i = 0; i < 5000; i++) {
+ if (t.test(5.0, 10.0, 7.0) != 57.0) {
+ throw new RuntimeException("Failed");
+ }
+ }
+ }
+}
--- a/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/compiler/testlibrary/rtm/RTMTestBase.java Wed Jul 05 22:38:24 2017 +0200
@@ -241,7 +241,7 @@
CommandLineOptionTest.UNLOCK_DIAGNOSTIC_VM_OPTIONS,
CommandLineOptionTest.UNLOCK_EXPERIMENTAL_VM_OPTIONS,
"-Xbootclasspath/a:.", "-XX:+WhiteBoxAPI",
- "-XaddExports:java.base/jdk.internal.misc=ALL-UNNAMED");
+ "--add-exports", "java.base/jdk.internal.misc=ALL-UNNAMED");
if (test != null) {
for (String method : test.getMethodsToCompileNames()) {
--- a/hotspot/test/native/logging/logTestUtils.inline.hpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/native/logging/logTestUtils.inline.hpp Wed Jul 05 22:38:24 2017 +0200
@@ -59,6 +59,20 @@
assert(!failed, "failed to create directory %s", name);
}
+static inline void delete_empty_directory(const char* name) {
+#ifdef _WINDOWS
+ if (!file_exists(name)) {
+ return;
+ }
+ bool failed;
+ failed = !RemoveDirectory(name);
+ EXPECT_FALSE(failed) << "failed to remove directory '" << name
+ << "': LastError = " << GetLastError();
+#else
+ delete_file(name);
+#endif
+}
+
static inline void init_log_file(const char* filename, const char* options = "") {
LogStreamHandle(Error, logging) stream;
bool success = LogConfiguration::parse_log_arguments(filename, "logging=trace", "", options, &stream);
--- a/hotspot/test/native/logging/test_logFileOutput.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/native/logging/test_logFileOutput.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -103,7 +103,7 @@
EXPECT_FALSE(fo.initialize(buf, &ss)) << "Accepted filesize that overflows";
}
-TEST(LogFileOutput, startup_rotation) {
+TEST_VM(LogFileOutput, startup_rotation) {
const size_t rotations = 5;
const char* filename = "start-rotate-test";
char* rotated_file[rotations];
@@ -140,7 +140,7 @@
}
}
-TEST(LogFileOutput, startup_truncation) {
+TEST_VM(LogFileOutput, startup_truncation) {
const char* filename = "start-truncate-test";
const char* archived_filename = "start-truncate-test.0";
@@ -168,7 +168,7 @@
delete_file(archived_filename);
}
-TEST(LogFileOutput, invalid_file) {
+TEST_VM(LogFileOutput, invalid_file) {
ResourceMark rm;
stringStream ss;
@@ -179,5 +179,5 @@
<< "file was initialized when there was an existing directory with the same name";
EXPECT_TRUE(string_contains_substring(ss.as_string(), "tmplogdir is not a regular file"))
<< "missing expected error message, received msg: %s" << ss.as_string();
- remove("tmplogdir");
+ delete_empty_directory("tmplogdir");
}
--- a/hotspot/test/native/logging/test_logMessageTest.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/native/logging/test_logMessageTest.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -10,7 +10,7 @@
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
- * ac_heapanied this code).
+ * accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
@@ -19,8 +19,8 @@
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
- *
*/
+
#include "precompiled.hpp"
#include "logTestFixture.hpp"
#include "logTestUtils.inline.hpp"
--- a/hotspot/test/native/logging/test_logStream.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/native/logging/test_logStream.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -41,41 +41,41 @@
EXPECT_TRUE(file_contains_substring(TestLogFileName, "3 workers\n"));
}
-TEST_F(LogStreamTest, from_log) {
+TEST_VM_F(LogStreamTest, from_log) {
Log(gc) log;
LogStream stream(log.debug());
verify_stream(&stream);
}
-TEST_F(LogStreamTest, from_logtarget) {
+TEST_VM_F(LogStreamTest, from_logtarget) {
LogTarget(Debug, gc) log;
LogStream stream(log);
verify_stream(&stream);
}
-TEST_F(LogStreamTest, handle) {
+TEST_VM_F(LogStreamTest, handle) {
LogStreamHandle(Debug, gc) stream;
verify_stream(&stream);
}
-TEST_F(LogStreamTest, no_rm) {
+TEST_VM_F(LogStreamTest, no_rm) {
ResourceMark rm;
outputStream* stream = LogTarget(Debug, gc)::stream();
verify_stream(stream);
}
-TEST_F(LogStreamTest, c_heap_stream) {
+TEST_VM_F(LogStreamTest, c_heap_stream) {
Log(gc) log;
LogStreamCHeap stream(log.debug());
verify_stream(&stream);
}
-TEST_F(LogStreamTest, c_heap_stream_target) {
+TEST_VM_F(LogStreamTest, c_heap_stream_target) {
LogTarget(Debug, gc) log;
LogStreamCHeap stream(log);
--- a/hotspot/test/native/utilities/test_linkedlist.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/native/utilities/test_linkedlist.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -74,7 +74,7 @@
ASSERT_EQ(six.value(), i->value()) << "Should be 6";
i = ll.find(three);
- ASSERT_EQ(NULL, i) << "Not in the list";
+ ASSERT_TRUE(i == NULL) << "Not in the list";
LinkedListNode<Integer>* node = ll.find_node(six);
ASSERT_TRUE(node != NULL) << "6 is in the list";
--- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -72,6 +72,6 @@
testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "WARNING: Unknown module: xyzz");
testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0",
"WARNING: package xyzz not in java.base");
- testOption("--patch-module", "=d", "jdk.module.patch.0", "Missing module name");
+ testOption("--patch-module", "=d", "jdk.module.patch.0", "Unable to parse --patch-module");
}
}
--- a/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/runtime/modules/PatchModule/PatchModuleCDS.java Wed Jul 05 22:38:24 2017 +0200
@@ -52,7 +52,7 @@
new OutputAnalyzer(pb.start())
.shouldContain("ro space:"); // Make sure archive got created.
- // Case 2: Test that only jar file in --patch-module is supported for CDS dumping
+ // Case 2: Test that directory in --patch-module is supported for CDS dumping
// Create a class file in the module java.base.
String source = "package javax.naming.spi; " +
"public class NamingManager { " +
@@ -73,7 +73,7 @@
"-Xlog:class+path=info",
"-version");
new OutputAnalyzer(pb.start())
- .shouldContain("--patch-module requires a regular file during dumping");
+ .shouldContain("ro space:"); // Make sure archive got created.
// Case 3a: Test CDS dumping with jar file in --patch-module
BasicJarBuilder.build("javanaming", "javax/naming/spi/NamingManager");
--- a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -136,11 +136,7 @@
if (Platform.isWindows()) {
return "bin";
}
- if (Platform.isOSX()) {
- return "lib";
- }
-
- return "lib/" + Platform.getOsArch();
+ return "lib";
}
/**
--- a/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Wed Jul 05 22:38:24 2017 +0200
@@ -82,14 +82,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
--- a/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Wed Jul 05 22:38:24 2017 +0200
@@ -81,14 +81,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
--- a/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Thu Dec 22 18:48:23 2016 +0000
+++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Wed Jul 05 22:38:24 2017 +0200
@@ -82,14 +82,18 @@
}
static
-jint throw_exc(JNIEnv *env, char *msg) {
+void throw_exc(JNIEnv *env, char *msg) {
jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));
+ jint rt = JNI_OK;
if (exc_class == NULL) {
printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);
- return -1;
+ return;
}
- return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);
+ if (rt == JNI_ERR) {
+ printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);
+ }
}
static
--- a/hotspot/test/serviceability/jvmti/ExceptionCaughtOutOfPhase/ExceptionCaughtOutOfPhaseTest.java Thu Dec 22 18:48:23 2016 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 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
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-/*
- * @test
- * @bug 8134434
- * @summary JVM_DoPrivileged() fires assert(_exception_caught == false) failed: _exception_caught is out of phase
- * @run main/othervm -agentlib:jdwp=transport=dt_socket,address=9000,server=y,suspend=n -Xbatch ExceptionCaughtOutOfPhaseTest
- */
-
-public class ExceptionCaughtOutOfPhaseTest {
- public static void main(String[] args) {
- PrivilegedAction action = new HotThrowingAction();
- System.out.println("### Warm-up");
- for(int i=0; i<11000; i++) {
- try {
- action.run(); // call run() to get it compiled
- } catch(Throwable t) {
- // ignored
- }
- }
-
- System.out.println("### Warm-up done");
- System.out.println("### Executing privileged action");
-
- try {
- AccessController.doPrivileged(action);
- } catch (Error e) {
- // ignored
- }
- }
-
- public static class HotThrowingAction implements PrivilegedAction {
- public Object run() {
- throw new Error();
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/serviceability/sa/TestHeapDumpForInvokeDynamic.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+import java.io.File;
+import java.nio.file.Files;
+import java.io.IOException;
+import java.io.BufferedInputStream;
+import java.util.stream.Collectors;
+import java.io.FileInputStream;
+
+import sun.jvm.hotspot.HotSpotAgent;
+import sun.jvm.hotspot.debugger.*;
+
+import jdk.test.lib.apps.LingeredApp;
+import jdk.test.lib.JDKToolLauncher;
+import jdk.test.lib.JDKToolFinder;
+import jdk.test.lib.Platform;
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.Utils;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.hprof.HprofParser;
+import jdk.test.lib.hprof.parser.HprofReader;
+import jdk.test.lib.hprof.parser.PositionDataInputStream;
+import jdk.test.lib.hprof.model.Snapshot;
+
+/*
+ * @test
+ * @library /test/lib
+ * @requires os.family != "mac"
+ * @modules java.base/jdk.internal.misc
+ * jdk.hotspot.agent/sun.jvm.hotspot
+ * jdk.hotspot.agent/sun.jvm.hotspot.utilities
+ * jdk.hotspot.agent/sun.jvm.hotspot.oops
+ * jdk.hotspot.agent/sun.jvm.hotspot.debugger
+ * @run main/othervm TestHeapDumpForInvokeDynamic
+ */
+
+public class TestHeapDumpForInvokeDynamic {
+
+ private static LingeredAppWithInvokeDynamic theApp = null;
+
+ private static void verifyHeapDump(String heapFile) {
+
+ File heapDumpFile = new File(heapFile);
+ Asserts.assertTrue(heapDumpFile.exists() && heapDumpFile.isFile(),
+ "Could not create dump file " + heapDumpFile.getAbsolutePath());
+ try (PositionDataInputStream in = new PositionDataInputStream(
+ new BufferedInputStream(new FileInputStream(heapFile)))) {
+ int i = in.readInt();
+ if (HprofReader.verifyMagicNumber(i)) {
+ Snapshot sshot;
+ HprofReader r = new HprofReader(heapFile, in, 0,
+ false, 0);
+ sshot = r.read();
+ } else {
+ throw new IOException("Unrecognized magic number: " + i);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ Asserts.fail("Could not read dump file " + heapFile);
+ } finally {
+ heapDumpFile.delete();
+ }
+ }
+
+ private static void attachDumpAndVerify(String heapDumpFileName,
+ long lingeredAppPid) throws Exception {
+
+ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jhsdb");
+ launcher.addToolArg("jmap");
+ launcher.addToolArg("--binaryheap");
+ launcher.addToolArg("--dumpfile");
+ launcher.addToolArg(heapDumpFileName);
+ launcher.addToolArg("--pid");
+ launcher.addToolArg(Long.toString(lingeredAppPid));
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.command(launcher.getCommand());
+ System.out.println(
+ processBuilder.command().stream().collect(Collectors.joining(" ")));
+
+ OutputAnalyzer SAOutput = ProcessTools.executeProcess(processBuilder);
+ SAOutput.shouldHaveExitValue(0);
+ SAOutput.shouldContain("heap written to");
+ SAOutput.shouldContain(heapDumpFileName);
+ System.out.println(SAOutput.getOutput());
+
+ verifyHeapDump(heapDumpFileName);
+ }
+
+ public static void main (String... args) throws Exception {
+
+ String heapDumpFileName = "lambdaHeapDump.bin";
+
+ if (!Platform.shouldSAAttach()) {
+ System.out.println(
+ "SA attach not expected to work - test skipped.");
+ return;
+ }
+
+ File heapDumpFile = new File(heapDumpFileName);
+ if (heapDumpFile.exists()) {
+ heapDumpFile.delete();
+ }
+
+ try {
+ List<String> vmArgs = new ArrayList<String>();
+ vmArgs.add("-XX:+UsePerfData");
+ vmArgs.addAll(Utils.getVmOptions());
+
+ theApp = new LingeredAppWithInvokeDynamic();
+ LingeredApp.startApp(vmArgs, theApp);
+ attachDumpAndVerify(heapDumpFileName, theApp.getPid());
+ } finally {
+ LingeredApp.stopApp(theApp);
+ }
+ }
+}
--- a/jdk/.hgtags Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/.hgtags Wed Jul 05 22:38:24 2017 +0200
@@ -392,3 +392,4 @@
c41140100bf1e5c10c7b8f3bde91c16eff7485f5 jdk-9+147
9098b2b9d997d65af0026fc2f39cf75234e26bc5 jdk-9+148
5a846396a24c7aff01d6a8feaa7afc0a6369f04d jdk-9+149
+71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150
--- a/jdk/make/gensrc/GensrcLocaleData.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/make/gensrc/GensrcLocaleData.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -64,7 +64,7 @@
BASE_LOCALES := en en-US
# Locales that don't have any resource files should be included here.
-ALL_NON_BASE_LOCALES := ja-JP-JP nb-NO nn-NO th-TH-TH
+ALL_NON_BASE_LOCALES := ja-JP-JP th-TH-TH
SED_BASEARGS := -e 's|$(HASH)warn This file is preprocessed before being compiled|// -- This file was mechanically generated: Do not edit! -- //|g'
SED_NONBASEARGS := $(SED_BASEARGS)
@@ -89,6 +89,10 @@
$1_NON_BASE_LOCALES := $$(subst zh-MO,zh-MO$$(SPACE)zh-Hant-MO, $$($1_NON_BASE_LOCALES))
$1_NON_BASE_LOCALES := $$(subst zh-TW,zh-TW$$(SPACE)zh-Hant-TW, $$($1_NON_BASE_LOCALES))
+# Adding implict locales nn-NO and nb-NO
+ $1_NON_BASE_LOCALES += nn-NO nb-NO
+ $1_NON_BASE_LOCALES := $$(sort $$($1_NON_BASE_LOCALES))
+
ALL_BASE_LOCALES += $$($1_BASE_LOCALES)
ALL_NON_BASE_LOCALES += $$($1_NON_BASE_LOCALES)
--- a/jdk/make/lib/Awt2dLibraries.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/make/lib/Awt2dLibraries.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -362,7 +362,6 @@
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libawt_xawt/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN) \
- $(call SET_SHARED_LIBRARY_ORIGIN,/..) \
-L$(INSTALL_LIBRARIES_HERE), \
LIBS := $(X_LIBS) $(LIBAWT_XAWT_LIBS), \
VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \
@@ -564,8 +563,6 @@
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \
- LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \
- LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \
REORDER := $(LIBAWT_HEADLESS_REORDER), \
LIBS_unix := -lawt -ljvm -ljava, \
LIBS_linux := $(LIBM) $(LIBDL), \
--- a/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/make/src/classes/build/tools/cldrconverter/CLDRConverter.java Wed Jul 05 22:38:24 2017 +0200
@@ -487,10 +487,43 @@
metaInfo.get("AvailableLocales").add(toLanguageTag(bundle.getID()));
addLikelySubtags(metaInfo, "AvailableLocales", bundle.getID());
}
-
+ addCldrImplicitLocales(metaInfo);
bundleGenerator.generateMetaInfo(metaInfo);
}
+ /**
+ * These are the Locales that are implicitly supported by CLDR.
+ * Adding them explicitly as likelySubtags here, will ensure that
+ * COMPAT locales do not precede them during ResourceBundle search path.
+ */
+ private static void addCldrImplicitLocales(Map<String, SortedSet<String>> metaInfo) {
+ metaInfo.get("LocaleNames").add("zh-Hans-CN");
+ metaInfo.get("LocaleNames").add("zh-Hans-SG");
+ metaInfo.get("LocaleNames").add("zh-Hant-HK");
+ metaInfo.get("LocaleNames").add("zh-Hant-MO");
+ metaInfo.get("LocaleNames").add("zh-Hant-TW");
+ metaInfo.get("CurrencyNames").add("zh-Hans-CN");
+ metaInfo.get("CurrencyNames").add("zh-Hans-SG");
+ metaInfo.get("CurrencyNames").add("zh-Hant-HK");
+ metaInfo.get("CurrencyNames").add("zh-Hant-MO");
+ metaInfo.get("CurrencyNames").add("zh-Hant-TW");
+ metaInfo.get("TimeZoneNames").add("zh-Hans-CN");
+ metaInfo.get("TimeZoneNames").add("zh-Hans-SG");
+ metaInfo.get("TimeZoneNames").add("zh-Hant-HK");
+ metaInfo.get("TimeZoneNames").add("zh-Hant-MO");
+ metaInfo.get("TimeZoneNames").add("zh-Hant-TW");
+ metaInfo.get("TimeZoneNames").add("zh-HK");
+ metaInfo.get("CalendarData").add("zh-Hans-CN");
+ metaInfo.get("CalendarData").add("zh-Hans-SG");
+ metaInfo.get("CalendarData").add("zh-Hant-HK");
+ metaInfo.get("CalendarData").add("zh-Hant-MO");
+ metaInfo.get("CalendarData").add("zh-Hant-TW");
+ metaInfo.get("FormatData").add("zh-Hans-CN");
+ metaInfo.get("FormatData").add("zh-Hans-SG");
+ metaInfo.get("FormatData").add("zh-Hant-HK");
+ metaInfo.get("FormatData").add("zh-Hant-MO");
+ metaInfo.get("FormatData").add("zh-Hant-TW");
+ }
static final Map<String, String> aliases = new HashMap<>();
/**
--- a/jdk/src/java.base/share/classes/java/nio/file/FileTreeWalker.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/nio/file/FileTreeWalker.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -353,12 +353,13 @@
}
}
- // no next entry so close and pop directory, creating corresponding event
+ // no next entry so close and pop directory,
+ // creating corresponding event
if (entry == null) {
try {
top.stream().close();
} catch (IOException e) {
- if (ioe != null) {
+ if (ioe == null) {
ioe = e;
} else {
ioe.addSuppressed(e);
--- a/jdk/src/java.base/share/classes/java/security/Policy.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/security/Policy.java Wed Jul 05 22:38:24 2017 +0200
@@ -28,7 +28,6 @@
import java.util.Enumeration;
import java.util.WeakHashMap;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.Objects;
import sun.security.jca.GetInstance;
import sun.security.util.Debug;
@@ -107,9 +106,10 @@
}
}
- // PolicyInfo is stored in an AtomicReference
- private static AtomicReference<PolicyInfo> policy =
- new AtomicReference<>(new PolicyInfo(null, false));
+ // PolicyInfo is volatile since we apply DCL during initialization.
+ // For correctness, care must be taken to read the field only once and only
+ // write to it after any other initialization action has taken place.
+ private static volatile PolicyInfo policyInfo = new PolicyInfo(null, false);
private static final Debug debug = Debug.getInstance("policy");
@@ -121,9 +121,8 @@
private WeakHashMap<ProtectionDomain.Key, PermissionCollection> pdMapping;
/** package private for AccessControlContext and ProtectionDomain */
- static boolean isSet()
- {
- PolicyInfo pi = policy.get();
+ static boolean isSet() {
+ PolicyInfo pi = policyInfo;
return pi.policy != null && pi.initialized == true;
}
@@ -168,16 +167,15 @@
*/
static Policy getPolicyNoCheck()
{
- PolicyInfo pi = policy.get();
+ PolicyInfo pi = policyInfo;
// Use double-check idiom to avoid locking if system-wide policy is
// already initialized
if (pi.initialized == false || pi.policy == null) {
synchronized (Policy.class) {
- PolicyInfo pinfo = policy.get();
- if (pinfo.policy == null) {
+ pi = policyInfo;
+ if (pi.policy == null) {
return loadPolicyProvider();
}
- return pinfo.policy;
}
}
return pi.policy;
@@ -206,7 +204,7 @@
policyProvider.equals(DEFAULT_POLICY))
{
Policy polFile = new sun.security.provider.PolicyFile();
- policy.set(new PolicyInfo(polFile, true));
+ policyInfo = new PolicyInfo(polFile, true);
return polFile;
}
@@ -216,7 +214,7 @@
* provider to avoid potential recursion.
*/
Policy polFile = new sun.security.provider.PolicyFile();
- policy.set(new PolicyInfo(polFile, false));
+ policyInfo = new PolicyInfo(polFile, false);
Policy pol = AccessController.doPrivileged(new PrivilegedAction<>() {
@Override
@@ -244,7 +242,7 @@
}
pol = polFile;
}
- policy.set(new PolicyInfo(pol, true));
+ policyInfo = new PolicyInfo(pol, true);
return pol;
}
@@ -274,7 +272,7 @@
initPolicy(p);
}
synchronized (Policy.class) {
- policy.set(new PolicyInfo(p, p != null));
+ policyInfo = new PolicyInfo(p, p != null);
}
}
@@ -326,7 +324,7 @@
}
if (policyDomain.getCodeSource() != null) {
- Policy pol = policy.get().policy;
+ Policy pol = policyInfo.policy;
if (pol != null) {
policyPerms = pol.getPermissions(policyDomain);
}
--- a/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/text/DateFormatSymbols.java Wed Jul 05 22:38:24 2017 +0200
@@ -758,16 +758,6 @@
dfs = y;
}
}
- // If the bundle's locale isn't the target locale, put another cache
- // entry for the bundle's locale.
- Locale bundleLocale = resource.getLocale();
- if (!bundleLocale.equals(locale)) {
- SoftReference<DateFormatSymbols> z
- = cachedInstances.putIfAbsent(bundleLocale, ref);
- if (z != null && z.get() == null) {
- cachedInstances.replace(bundleLocale, z, ref);
- }
- }
}
// Copy the field values from dfs to this instance.
--- a/jdk/src/java.base/share/classes/java/time/LocalDateTime.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/time/LocalDateTime.java Wed Jul 05 22:38:24 2017 +0200
@@ -1407,8 +1407,8 @@
* </ol>
* <p>
* For example, 2008-02-29 (leap year) minus one year would result in the
- * invalid date 2009-02-29 (standard year). Instead of returning an invalid
- * result, the last valid day of the month, 2009-02-28, is selected instead.
+ * invalid date 2007-02-29 (standard year). Instead of returning an invalid
+ * result, the last valid day of the month, 2007-02-28, is selected instead.
* <p>
* This instance is immutable and unaffected by this method call.
*
@@ -1431,8 +1431,8 @@
* </ol>
* <p>
* For example, 2007-03-31 minus one month would result in the invalid date
- * 2007-04-31. Instead of returning an invalid result, the last valid day
- * of the month, 2007-04-30, is selected instead.
+ * 2007-02-31. Instead of returning an invalid result, the last valid day
+ * of the month, 2007-02-28, is selected instead.
* <p>
* This instance is immutable and unaffected by this method call.
*
--- a/jdk/src/java.base/share/classes/java/time/OffsetDateTime.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/time/OffsetDateTime.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -1393,8 +1393,8 @@
* </ol>
* <p>
* For example, 2008-02-29 (leap year) minus one year would result in the
- * invalid date 2009-02-29 (standard year). Instead of returning an invalid
- * result, the last valid day of the month, 2009-02-28, is selected instead.
+ * invalid date 2007-02-29 (standard year). Instead of returning an invalid
+ * result, the last valid day of the month, 2007-02-28, is selected instead.
* <p>
* This instance is immutable and unaffected by this method call.
*
@@ -1417,8 +1417,8 @@
* </ol>
* <p>
* For example, 2007-03-31 minus one month would result in the invalid date
- * 2007-04-31. Instead of returning an invalid result, the last valid day
- * of the month, 2007-04-30, is selected instead.
+ * 2007-02-31. Instead of returning an invalid result, the last valid day
+ * of the month, 2007-02-28, is selected instead.
* <p>
* This instance is immutable and unaffected by this method call.
*
@@ -1437,7 +1437,7 @@
* the month and year fields as necessary to ensure the result remains valid.
* The result is only invalid if the maximum/minimum year is exceeded.
* <p>
- * For example, 2008-12-31 minus one week would result in 2009-01-07.
+ * For example, 2009-01-07 minus one week would result in 2008-12-31.
* <p>
* This instance is immutable and unaffected by this method call.
*
@@ -1456,7 +1456,7 @@
* month and year fields as necessary to ensure the result remains valid.
* The result is only invalid if the maximum/minimum year is exceeded.
* <p>
- * For example, 2008-12-31 minus one day would result in 2009-01-01.
+ * For example, 2009-01-01 minus one day would result in 2008-12-31.
* <p>
* This instance is immutable and unaffected by this method call.
*
--- a/jdk/src/java.base/share/classes/java/time/Period.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/time/Period.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -818,7 +818,7 @@
* Returns a copy of this period with the years and months normalized.
* <p>
* This normalizes the years and months units, leaving the days unit unchanged.
- * The months unit is adjusted to have an absolute value less than 11,
+ * The months unit is adjusted to have an absolute value less than 12,
* with the years unit being adjusted to compensate. For example, a period of
* "1 Year and 15 months" will be normalized to "2 years and 3 months".
* <p>
--- a/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java Wed Jul 05 22:38:24 2017 +0200
@@ -1774,16 +1774,20 @@
if (count > 1) {
throw new IllegalArgumentException("Too many pattern letters: " + cur);
}
- appendInternal(new WeekBasedFieldPrinterParser(cur, count));
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count));
} else if (cur == 'w') {
// Fields defined by Locale
if (count > 2) {
throw new IllegalArgumentException("Too many pattern letters: " + cur);
}
- appendInternal(new WeekBasedFieldPrinterParser(cur, count));
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 2));
} else if (cur == 'Y') {
// Fields defined by Locale
- appendInternal(new WeekBasedFieldPrinterParser(cur, count));
+ if (count == 2) {
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 2));
+ } else {
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, 19));
+ }
} else {
throw new IllegalArgumentException("Unknown pattern letter: " + cur);
}
@@ -1843,7 +1847,10 @@
}
break;
case 'c':
- if (count == 2) {
+ if (count == 1) {
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count));
+ break;
+ } else if (count == 2) {
throw new IllegalArgumentException("Invalid pattern \"cc\"");
}
/*fallthrough*/
@@ -1858,8 +1865,8 @@
switch (count) {
case 1:
case 2:
- if (cur == 'c' || cur == 'e') {
- appendInternal(new WeekBasedFieldPrinterParser(cur, count));
+ if (cur == 'e') {
+ appendValue(new WeekBasedFieldPrinterParser(cur, count, count, count));
} else if (cur == 'E') {
appendText(field, TextStyle.SHORT);
} else {
@@ -4770,8 +4777,9 @@
* the field is to be printed or parsed.
* The locale is needed to select the proper WeekFields from which
* the field for day-of-week, week-of-month, or week-of-year is selected.
+ * Hence the inherited field NumberPrinterParser.field is unused.
*/
- static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
+ static final class WeekBasedFieldPrinterParser extends NumberPrinterParser {
private char chr;
private int count;
@@ -4780,12 +4788,55 @@
*
* @param chr the pattern format letter that added this PrinterParser.
* @param count the repeat count of the format letter
+ * @param minWidth the minimum field width, from 1 to 19
+ * @param maxWidth the maximum field width, from minWidth to 19
*/
- WeekBasedFieldPrinterParser(char chr, int count) {
+ WeekBasedFieldPrinterParser(char chr, int count, int minWidth, int maxWidth) {
+ this(chr, count, minWidth, maxWidth, 0);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param chr the pattern format letter that added this PrinterParser.
+ * @param count the repeat count of the format letter
+ * @param minWidth the minimum field width, from 1 to 19
+ * @param maxWidth the maximum field width, from minWidth to 19
+ * @param subsequentWidth the width of subsequent non-negative numbers, 0 or greater,
+ * -1 if fixed width due to active adjacent parsing
+ */
+ WeekBasedFieldPrinterParser(char chr, int count, int minWidth, int maxWidth,
+ int subsequentWidth) {
+ super(null, minWidth, maxWidth, SignStyle.NOT_NEGATIVE, subsequentWidth);
this.chr = chr;
this.count = count;
}
+ /**
+ * Returns a new instance with fixed width flag set.
+ *
+ * @return a new updated printer-parser, not null
+ */
+ @Override
+ WeekBasedFieldPrinterParser withFixedWidth() {
+ if (subsequentWidth == -1) {
+ return this;
+ }
+ return new WeekBasedFieldPrinterParser(chr, count, minWidth, maxWidth, -1);
+ }
+
+ /**
+ * Returns a new instance with an updated subsequent width.
+ *
+ * @param subsequentWidth the width of subsequent non-negative numbers, 0 or greater
+ * @return a new updated printer-parser, not null
+ */
+ @Override
+ WeekBasedFieldPrinterParser withSubsequentWidth(int subsequentWidth) {
+ return new WeekBasedFieldPrinterParser(chr, count, minWidth, maxWidth,
+ this.subsequentWidth + subsequentWidth);
+ }
+
@Override
public boolean format(DateTimePrintContext context, StringBuilder buf) {
return printerParser(context.getLocale()).format(context, buf);
@@ -4810,10 +4861,12 @@
case 'Y':
field = weekDef.weekBasedYear();
if (count == 2) {
- return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0);
+ return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE,
+ this.subsequentWidth);
} else {
return new NumberPrinterParser(field, count, 19,
- (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);
+ (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD,
+ this.subsequentWidth);
}
case 'e':
case 'c':
@@ -4828,7 +4881,8 @@
default:
throw new IllegalStateException("unreachable");
}
- return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE);
+ return new NumberPrinterParser(field, minWidth, maxWidth, SignStyle.NOT_NEGATIVE,
+ this.subsequentWidth);
}
@Override
--- a/jdk/src/java.base/share/classes/java/util/ArrayDeque.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ArrayDeque.java Wed Jul 05 22:38:24 2017 +0200
@@ -146,16 +146,16 @@
if (jump < needed
|| (newCapacity = (oldCapacity + jump)) - MAX_ARRAY_SIZE > 0)
newCapacity = newCapacity(needed, jump);
- elements = Arrays.copyOf(elements, newCapacity);
+ final Object[] es = elements = Arrays.copyOf(elements, newCapacity);
// Exceptionally, here tail == head needs to be disambiguated
- if (tail < head || (tail == head && elements[head] != null)) {
+ if (tail < head || (tail == head && es[head] != null)) {
// wrap around; slide first leg forward to end of array
int newSpace = newCapacity - oldCapacity;
- System.arraycopy(elements, head,
- elements, head + newSpace,
+ System.arraycopy(es, head,
+ es, head + newSpace,
oldCapacity - head);
- Arrays.fill(elements, head, head + newSpace, null);
- head += newSpace;
+ for (int i = head, to = (head += newSpace); i < to; i++)
+ es[i] = null;
}
}
@@ -873,6 +873,9 @@
}
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final Object[] es = elements;
@@ -1035,11 +1038,14 @@
/**
* Nulls out slots starting at array index i, upto index end.
+ * Condition i == end means "empty" - nothing to do.
*/
private static void circularClear(Object[] es, int i, int end) {
+ // assert 0 <= i && i < es.length;
+ // assert 0 <= end && end < es.length;
for (int to = (i <= end) ? end : es.length;
; i = 0, to = end) {
- Arrays.fill(es, i, to, null);
+ for (; i < to; i++) es[i] = null;
if (to == end) break;
}
}
--- a/jdk/src/java.base/share/classes/java/util/ArrayList.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ArrayList.java Wed Jul 05 22:38:24 2017 +0200
@@ -576,8 +576,9 @@
*/
public void clear() {
modCount++;
- Arrays.fill(elementData, 0, size, null);
- size = 0;
+ final Object[] es = elementData;
+ for (int to = size, i = size = 0; i < to; i++)
+ es[i] = null;
}
/**
@@ -665,10 +666,14 @@
outOfBoundsMsg(fromIndex, toIndex));
}
modCount++;
- final Object[] es = elementData;
- final int oldSize = size;
- System.arraycopy(es, toIndex, es, fromIndex, oldSize - toIndex);
- Arrays.fill(es, size -= (toIndex - fromIndex), oldSize, null);
+ shiftTailOverGap(elementData, fromIndex, toIndex);
+ }
+
+ /** Erases the gap from lo to hi, by sliding down following elements. */
+ private void shiftTailOverGap(Object[] es, int lo, int hi) {
+ System.arraycopy(es, hi, es, lo, size - hi);
+ for (int to = size, i = (size -= hi - lo); i < to; i++)
+ es[i] = null;
}
/**
@@ -756,25 +761,25 @@
w += end - r;
throw ex;
} finally {
- final int oldSize = size, deleted = end - w;
- modCount += deleted;
- System.arraycopy(es, end, es, w, oldSize - end);
- Arrays.fill(es, size -= deleted, oldSize, null);
+ modCount += end - w;
+ shiftTailOverGap(es, w, end);
}
}
return modified;
}
/**
- * Save the state of the {@code ArrayList} instance to a stream (that
- * is, serialize it).
+ * Saves the state of the {@code ArrayList} instance to a stream
+ * (that is, serializes it).
*
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
* @serialData The length of the array backing the {@code ArrayList}
* instance is emitted (int), followed by all of its elements
* (each an {@code Object}) in the proper order.
*/
private void writeObject(java.io.ObjectOutputStream s)
- throws java.io.IOException{
+ throws java.io.IOException {
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject();
@@ -793,8 +798,12 @@
}
/**
- * Reconstitute the {@code ArrayList} instance from a stream (that is,
- * deserialize it).
+ * Reconstitutes the {@code ArrayList} instance from a stream (that is,
+ * deserializes it).
+ * @param s the stream
+ * @throws ClassNotFoundException if the class of a serialized object
+ * could not be found
+ * @throws java.io.IOException if an I/O error occurs
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
@@ -1285,9 +1294,8 @@
public Spliterator<E> spliterator() {
checkForComodification();
- // ArrayListSpliterator is not used because late-binding logic
- // is different here
- return new Spliterator<>() {
+ // ArrayListSpliterator not used here due to late-binding
+ return new Spliterator<E>() {
private int index = offset; // current index, modified on advance/split
private int fence = -1; // -1 until used; then one past last index
private int expectedModCount; // initialized when fence set
@@ -1301,12 +1309,11 @@
return hi;
}
- public ArrayListSpliterator<E> trySplit() {
+ public ArrayList<E>.ArrayListSpliterator trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
- // ArrayListSpliterator could be used here as the source is already bound
+ // ArrayListSpliterator can be used here as the source is already bound
return (lo >= mid) ? null : // divide range in half unless too small
- new ArrayListSpliterator<>(root, lo, index = mid,
- expectedModCount);
+ root.new ArrayListSpliterator(lo, index = mid, expectedModCount);
}
public boolean tryAdvance(Consumer<? super E> action) {
@@ -1348,7 +1355,7 @@
}
public long estimateSize() {
- return (long) (getFence() - index);
+ return getFence() - index;
}
public int characteristics() {
@@ -1358,6 +1365,9 @@
}
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
@Override
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
@@ -1385,11 +1395,11 @@
*/
@Override
public Spliterator<E> spliterator() {
- return new ArrayListSpliterator<>(this, 0, -1, 0);
+ return new ArrayListSpliterator(0, -1, 0);
}
/** Index-based split-by-two, lazily initialized Spliterator */
- static final class ArrayListSpliterator<E> implements Spliterator<E> {
+ final class ArrayListSpliterator implements Spliterator<E> {
/*
* If ArrayLists were immutable, or structurally immutable (no
@@ -1423,15 +1433,12 @@
* these streamlinings.
*/
- private final ArrayList<E> list;
private int index; // current index, modified on advance/split
private int fence; // -1 until used; then one past last index
private int expectedModCount; // initialized when fence set
- /** Create new spliterator covering the given range */
- ArrayListSpliterator(ArrayList<E> list, int origin, int fence,
- int expectedModCount) {
- this.list = list; // OK if null unless traversed
+ /** Creates new spliterator covering the given range. */
+ ArrayListSpliterator(int origin, int fence, int expectedModCount) {
this.index = origin;
this.fence = fence;
this.expectedModCount = expectedModCount;
@@ -1439,23 +1446,17 @@
private int getFence() { // initialize fence to size on first use
int hi; // (a specialized variant appears in method forEach)
- ArrayList<E> lst;
if ((hi = fence) < 0) {
- if ((lst = list) == null)
- hi = fence = 0;
- else {
- expectedModCount = lst.modCount;
- hi = fence = lst.size;
- }
+ expectedModCount = modCount;
+ hi = fence = size;
}
return hi;
}
- public ArrayListSpliterator<E> trySplit() {
+ public ArrayListSpliterator trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
return (lo >= mid) ? null : // divide range in half unless too small
- new ArrayListSpliterator<>(list, lo, index = mid,
- expectedModCount);
+ new ArrayListSpliterator(lo, index = mid, expectedModCount);
}
public boolean tryAdvance(Consumer<? super E> action) {
@@ -1464,9 +1465,9 @@
int hi = getFence(), i = index;
if (i < hi) {
index = i + 1;
- @SuppressWarnings("unchecked") E e = (E)list.elementData[i];
+ @SuppressWarnings("unchecked") E e = (E)elementData[i];
action.accept(e);
- if (list.modCount != expectedModCount)
+ if (modCount != expectedModCount)
throw new ConcurrentModificationException();
return true;
}
@@ -1475,13 +1476,13 @@
public void forEachRemaining(Consumer<? super E> action) {
int i, hi, mc; // hoist accesses and checks from loop
- ArrayList<E> lst; Object[] a;
+ Object[] a;
if (action == null)
throw new NullPointerException();
- if ((lst = list) != null && (a = lst.elementData) != null) {
+ if ((a = elementData) != null) {
if ((hi = fence) < 0) {
- mc = lst.modCount;
- hi = lst.size;
+ mc = modCount;
+ hi = size;
}
else
mc = expectedModCount;
@@ -1490,7 +1491,7 @@
@SuppressWarnings("unchecked") E e = (E) a[i];
action.accept(e);
}
- if (lst.modCount == mc)
+ if (modCount == mc)
return;
}
}
@@ -1498,7 +1499,7 @@
}
public long estimateSize() {
- return (long) (getFence() - index);
+ return getFence() - index;
}
public int characteristics() {
@@ -1518,6 +1519,9 @@
return (bits[i >> 6] & (1L << i)) == 0;
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
@Override
public boolean removeIf(Predicate<? super E> filter) {
return removeIf(filter, 0, size);
@@ -1552,9 +1556,7 @@
for (i = beg; i < end; i++)
if (isClear(deathRow, i - beg))
es[w++] = es[i];
- final int oldSize = size;
- System.arraycopy(es, end, es, w, oldSize - end);
- Arrays.fill(es, size -= (end - w), oldSize, null);
+ shiftTailOverGap(es, w, end);
return true;
} else {
if (modCount != expectedModCount)
--- a/jdk/src/java.base/share/classes/java/util/PriorityQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/PriorityQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -522,6 +522,8 @@
*/
private int expectedModCount = modCount;
+ Itr() {} // prevent access constructor creation
+
public boolean hasNext() {
return cursor < size ||
(forgetMeNot != null && !forgetMeNot.isEmpty());
@@ -631,7 +633,7 @@
* promoting x up the tree until it is greater than or equal to
* its parent, or is the root.
*
- * To simplify and speed up coercions and comparisons. the
+ * To simplify and speed up coercions and comparisons, the
* Comparable and Comparator versions are separated into different
* methods that are otherwise identical. (Similarly for siftDown.)
*
@@ -727,11 +729,18 @@
/**
* Establishes the heap invariant (described above) in the entire tree,
* assuming nothing about the order of the elements prior to the call.
+ * This classic algorithm due to Floyd (1964) is known to be O(size).
*/
@SuppressWarnings("unchecked")
private void heapify() {
- for (int i = (size >>> 1) - 1; i >= 0; i--)
- siftDown(i, (E) queue[i]);
+ final Object[] es = queue;
+ final int half = (size >>> 1) - 1;
+ if (comparator == null)
+ for (int i = half; i >= 0; i--)
+ siftDownComparable(i, (E) es[i]);
+ else
+ for (int i = half; i >= 0; i--)
+ siftDownUsingComparator(i, (E) es[i]);
}
/**
@@ -812,23 +821,16 @@
* @since 1.8
*/
public final Spliterator<E> spliterator() {
- return new PriorityQueueSpliterator<>(this, 0, -1, 0);
+ return new PriorityQueueSpliterator(0, -1, 0);
}
- static final class PriorityQueueSpliterator<E> implements Spliterator<E> {
- /*
- * This is very similar to ArrayList Spliterator, except for
- * extra null checks.
- */
- private final PriorityQueue<E> pq;
+ final class PriorityQueueSpliterator implements Spliterator<E> {
private int index; // current index, modified on advance/split
private int fence; // -1 until first use
private int expectedModCount; // initialized when fence set
/** Creates new spliterator covering the given range. */
- PriorityQueueSpliterator(PriorityQueue<E> pq, int origin, int fence,
- int expectedModCount) {
- this.pq = pq;
+ PriorityQueueSpliterator(int origin, int fence, int expectedModCount) {
this.index = origin;
this.fence = fence;
this.expectedModCount = expectedModCount;
@@ -837,68 +839,54 @@
private int getFence() { // initialize fence to size on first use
int hi;
if ((hi = fence) < 0) {
- expectedModCount = pq.modCount;
- hi = fence = pq.size;
+ expectedModCount = modCount;
+ hi = fence = size;
}
return hi;
}
- public PriorityQueueSpliterator<E> trySplit() {
+ public PriorityQueueSpliterator trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
return (lo >= mid) ? null :
- new PriorityQueueSpliterator<>(pq, lo, index = mid,
- expectedModCount);
+ new PriorityQueueSpliterator(lo, index = mid, expectedModCount);
}
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> action) {
- int i, hi, mc; // hoist accesses and checks from loop
- PriorityQueue<E> q; Object[] a;
if (action == null)
throw new NullPointerException();
- if ((q = pq) != null && (a = q.queue) != null) {
- if ((hi = fence) < 0) {
- mc = q.modCount;
- hi = q.size;
- }
- else
- mc = expectedModCount;
- if ((i = index) >= 0 && (index = hi) <= a.length) {
- for (E e;; ++i) {
- if (i < hi) {
- if ((e = (E) a[i]) == null) // must be CME
- break;
- action.accept(e);
- }
- else if (q.modCount != mc)
- break;
- else
- return;
- }
- }
+ if (fence < 0) { fence = size; expectedModCount = modCount; }
+ final Object[] a = queue;
+ int i, hi; E e;
+ for (i = index, index = hi = fence; i < hi; i++) {
+ if ((e = (E) a[i]) == null)
+ break; // must be CME
+ action.accept(e);
}
- throw new ConcurrentModificationException();
+ if (modCount != expectedModCount)
+ throw new ConcurrentModificationException();
}
+ @SuppressWarnings("unchecked")
public boolean tryAdvance(Consumer<? super E> action) {
if (action == null)
throw new NullPointerException();
- int hi = getFence(), lo = index;
- if (lo >= 0 && lo < hi) {
- index = lo + 1;
- @SuppressWarnings("unchecked") E e = (E)pq.queue[lo];
- if (e == null)
+ if (fence < 0) { fence = size; expectedModCount = modCount; }
+ int i;
+ if ((i = index) < fence) {
+ index = i + 1;
+ E e;
+ if ((e = (E) queue[i]) == null
+ || modCount != expectedModCount)
throw new ConcurrentModificationException();
action.accept(e);
- if (pq.modCount != expectedModCount)
- throw new ConcurrentModificationException();
return true;
}
return false;
}
public long estimateSize() {
- return (long) (getFence() - index);
+ return getFence() - index;
}
public int characteristics() {
--- a/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/ResourceBundle.java Wed Jul 05 22:38:24 2017 +0200
@@ -2942,17 +2942,6 @@
script = "Hans";
break;
}
- } else if (script.length() > 0 && region.length() == 0) {
- // Supply region(country) for users who still package Chinese
- // bundles using old convension.
- switch (script) {
- case "Hans":
- region = "CN";
- break;
- case "Hant":
- region = "TW";
- break;
- }
}
}
@@ -2983,6 +2972,21 @@
}
if (script.length() > 0) {
list.add(Locale.getInstance(language, script, "", "", null));
+ // Special handling for Chinese
+ if (language.equals("zh")) {
+ if (region.length() == 0) {
+ // Supply region(country) for users who still package Chinese
+ // bundles using old convension.
+ switch (script) {
+ case "Hans":
+ region = "CN";
+ break;
+ case "Hant":
+ region = "TW";
+ break;
+ }
+ }
+ }
// With script, after truncating variant, region and script,
// start over without script.
--- a/jdk/src/java.base/share/classes/java/util/SplittableRandom.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/SplittableRandom.java Wed Jul 05 22:38:24 2017 +0200
@@ -375,7 +375,7 @@
* may, and typically does, vary across program invocations.
*/
public SplittableRandom() { // emulate defaultGen.split()
- long s = defaultGen.getAndAdd(2 * GOLDEN_GAMMA);
+ long s = defaultGen.getAndAdd(GOLDEN_GAMMA << 1);
this.seed = mix64(s);
this.gamma = mixGamma(s + GOLDEN_GAMMA);
}
--- a/jdk/src/java.base/share/classes/java/util/Vector.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/Vector.java Wed Jul 05 22:38:24 2017 +0200
@@ -306,9 +306,9 @@
modCount++;
if (newSize > elementData.length)
grow(newSize);
- for (int i = newSize; i < elementCount; i++)
- elementData[i] = null;
- elementCount = newSize;
+ final Object[] es = elementData;
+ for (int to = elementCount, i = elementCount = newSize; i < to; i++)
+ es[i] = null;
}
/**
@@ -675,9 +675,10 @@
* method (which is part of the {@link List} interface).
*/
public synchronized void removeAllElements() {
- Arrays.fill(elementData, 0, elementCount, null);
+ final Object[] es = elementData;
+ for (int to = elementCount, i = elementCount = 0; i < to; i++)
+ es[i] = null;
modCount++;
- elementCount = 0;
}
/**
@@ -980,6 +981,9 @@
return bulkRemove(e -> !c.contains(e));
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
@Override
public boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
@@ -1024,7 +1028,8 @@
for (i = beg; i < end; i++)
if (isClear(deathRow, i - beg))
es[w++] = es[i];
- Arrays.fill(es, elementCount = w, end, null);
+ for (i = elementCount = w; i < end; i++)
+ es[i] = null;
return true;
} else {
if (modCount != expectedModCount)
@@ -1152,19 +1157,25 @@
* (If {@code toIndex==fromIndex}, this operation has no effect.)
*/
protected synchronized void removeRange(int fromIndex, int toIndex) {
- final Object[] es = elementData;
- final int oldSize = elementCount;
- System.arraycopy(es, toIndex, es, fromIndex, oldSize - toIndex);
+ modCount++;
+ shiftTailOverGap(elementData, fromIndex, toIndex);
+ }
- modCount++;
- Arrays.fill(es, elementCount -= (toIndex - fromIndex), oldSize, null);
+ /** Erases the gap from lo to hi, by sliding down following elements. */
+ private void shiftTailOverGap(Object[] es, int lo, int hi) {
+ System.arraycopy(es, hi, es, lo, elementCount - hi);
+ for (int to = elementCount, i = (elementCount -= hi - lo); i < to; i++)
+ es[i] = null;
}
/**
- * Save the state of the {@code Vector} instance to a stream (that
- * is, serialize it).
+ * Saves the state of the {@code Vector} instance to a stream
+ * (that is, serializes it).
* This method performs synchronization to ensure the consistency
* of the serialized data.
+ *
+ * @param s the stream
+ * @throws java.io.IOException if an I/O error occurs
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
@@ -1337,6 +1348,9 @@
}
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
@Override
public synchronized void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
@@ -1349,6 +1363,9 @@
throw new ConcurrentModificationException();
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
@Override
public synchronized void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
@@ -1387,21 +1404,19 @@
*/
@Override
public Spliterator<E> spliterator() {
- return new VectorSpliterator<>(this, null, 0, -1, 0);
+ return new VectorSpliterator(null, 0, -1, 0);
}
/** Similar to ArrayList Spliterator */
- static final class VectorSpliterator<E> implements Spliterator<E> {
- private final Vector<E> list;
+ final class VectorSpliterator implements Spliterator<E> {
private Object[] array;
private int index; // current index, modified on advance/split
private int fence; // -1 until used; then one past last index
private int expectedModCount; // initialized when fence set
- /** Create new spliterator covering the given range */
- VectorSpliterator(Vector<E> list, Object[] array, int origin, int fence,
+ /** Creates new spliterator covering the given range. */
+ VectorSpliterator(Object[] array, int origin, int fence,
int expectedModCount) {
- this.list = list;
this.array = array;
this.index = origin;
this.fence = fence;
@@ -1411,10 +1426,10 @@
private int getFence() { // initialize on first use
int hi;
if ((hi = fence) < 0) {
- synchronized (list) {
- array = list.elementData;
- expectedModCount = list.modCount;
- hi = fence = list.elementCount;
+ synchronized (Vector.this) {
+ array = elementData;
+ expectedModCount = modCount;
+ hi = fence = elementCount;
}
}
return hi;
@@ -1423,8 +1438,7 @@
public Spliterator<E> trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
return (lo >= mid) ? null :
- new VectorSpliterator<>(list, array, lo, index = mid,
- expectedModCount);
+ new VectorSpliterator(array, lo, index = mid, expectedModCount);
}
@SuppressWarnings("unchecked")
@@ -1435,7 +1449,7 @@
if (getFence() > (i = index)) {
index = i + 1;
action.accept((E)array[i]);
- if (list.modCount != expectedModCount)
+ if (modCount != expectedModCount)
throw new ConcurrentModificationException();
return true;
}
@@ -1444,28 +1458,15 @@
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> action) {
- int i, hi; // hoist accesses and checks from loop
- Vector<E> lst; Object[] a;
if (action == null)
throw new NullPointerException();
- if ((lst = list) != null) {
- if ((hi = fence) < 0) {
- synchronized (lst) {
- expectedModCount = lst.modCount;
- a = array = lst.elementData;
- hi = fence = lst.elementCount;
- }
- }
- else
- a = array;
- if (a != null && (i = index) >= 0 && (index = hi) <= a.length) {
- while (i < hi)
- action.accept((E) a[i++]);
- if (lst.modCount == expectedModCount)
- return;
- }
- }
- throw new ConcurrentModificationException();
+ final int hi = getFence();
+ final Object[] a = array;
+ int i;
+ for (i = index, index = hi; i < hi; i++)
+ action.accept((E) a[i]);
+ if (modCount != expectedModCount)
+ throw new ConcurrentModificationException();
}
public long estimateSize() {
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -675,12 +675,14 @@
/**
* Nulls out slots starting at array index i, upto index end.
- * If i == end, the entire array is cleared!
+ * Condition i == end means "full" - the entire array is cleared.
*/
private static void circularClear(Object[] items, int i, int end) {
+ // assert 0 <= i && i < items.length;
+ // assert 0 <= end && end < items.length;
for (int to = (i < end) ? end : items.length;
; i = 0, to = end) {
- Arrays.fill(items, i, to, null);
+ for (; i < to; i++) items[i] = null;
if (to == end) break;
}
}
@@ -1011,6 +1013,11 @@
* expected element to remove, in lastItem. Yes, we may fail to
* remove lastItem from the queue if it moved due to an interleaved
* interior remove while in detached mode.
+ *
+ * Method forEachRemaining, added in Java 8, is treated similarly
+ * to hasNext returning false, in that we switch to detached mode,
+ * but we regard it as an even stronger request to "close" this
+ * iteration, and don't bother supporting subsequent remove().
*/
private class Itr implements Iterator<E> {
/** Index to look for new nextItem; NONE at end */
@@ -1432,6 +1439,9 @@
Spliterator.CONCURRENT));
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
final ReentrantLock lock = this.lock;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Wed Jul 05 22:38:24 2017 +0200
@@ -48,6 +48,7 @@
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
+import java.util.function.Predicate;
/**
* An unbounded concurrent {@linkplain Deque deque} based on linked nodes.
@@ -864,8 +865,8 @@
public E peekFirst() {
for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null)
+ final E item;
+ if ((item = p.item) != null)
return item;
}
return null;
@@ -873,8 +874,8 @@
public E peekLast() {
for (Node<E> p = last(); p != null; p = pred(p)) {
- E item = p.item;
- if (item != null)
+ final E item;
+ if ((item = p.item) != null)
return item;
}
return null;
@@ -896,8 +897,9 @@
public E pollFirst() {
for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null && ITEM.compareAndSet(p, item, null)) {
+ final E item;
+ if ((item = p.item) != null
+ && ITEM.compareAndSet(p, item, null)) {
unlink(p);
return item;
}
@@ -907,8 +909,9 @@
public E pollLast() {
for (Node<E> p = last(); p != null; p = pred(p)) {
- E item = p.item;
- if (item != null && ITEM.compareAndSet(p, item, null)) {
+ final E item;
+ if ((item = p.item) != null
+ && ITEM.compareAndSet(p, item, null)) {
unlink(p);
return item;
}
@@ -993,9 +996,10 @@
public boolean removeFirstOccurrence(Object o) {
Objects.requireNonNull(o);
for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null && o.equals(item) &&
- ITEM.compareAndSet(p, item, null)) {
+ final E item;
+ if ((item = p.item) != null
+ && o.equals(item)
+ && ITEM.compareAndSet(p, item, null)) {
unlink(p);
return true;
}
@@ -1018,9 +1022,10 @@
public boolean removeLastOccurrence(Object o) {
Objects.requireNonNull(o);
for (Node<E> p = last(); p != null; p = pred(p)) {
- E item = p.item;
- if (item != null && o.equals(item) &&
- ITEM.compareAndSet(p, item, null)) {
+ final E item;
+ if ((item = p.item) != null
+ && o.equals(item)
+ && ITEM.compareAndSet(p, item, null)) {
unlink(p);
return true;
}
@@ -1039,8 +1044,8 @@
public boolean contains(Object o) {
if (o != null) {
for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null && o.equals(item))
+ final E item;
+ if ((item = p.item) != null && o.equals(item))
return true;
}
}
@@ -1181,8 +1186,8 @@
int charLength = 0;
int size = 0;
for (Node<E> p = first(); p != null;) {
- E item = p.item;
- if (item != null) {
+ final E item;
+ if ((item = p.item) != null) {
if (a == null)
a = new String[4];
else if (size == a.length)
@@ -1207,8 +1212,8 @@
restartFromHead: for (;;) {
int size = 0;
for (Node<E> p = first(); p != null;) {
- E item = p.item;
- if (item != null) {
+ final E item;
+ if ((item = p.item) != null) {
if (x == null)
x = new Object[4];
else if (size == x.length)
@@ -1360,8 +1365,8 @@
nextItem = null;
break;
}
- E item = p.item;
- if (item != null) {
+ final E item;
+ if ((item = p.item) != null) {
nextNode = p;
nextItem = item;
break;
@@ -1391,36 +1396,33 @@
/** Forward iterator */
private class Itr extends AbstractItr {
+ Itr() {} // prevent access constructor creation
Node<E> startNode() { return first(); }
Node<E> nextNode(Node<E> p) { return succ(p); }
}
/** Descending iterator */
private class DescendingItr extends AbstractItr {
+ DescendingItr() {} // prevent access constructor creation
Node<E> startNode() { return last(); }
Node<E> nextNode(Node<E> p) { return pred(p); }
}
/** A customized variant of Spliterators.IteratorSpliterator */
- static final class CLDSpliterator<E> implements Spliterator<E> {
+ final class CLDSpliterator implements Spliterator<E> {
static final int MAX_BATCH = 1 << 25; // max batch array size;
- final ConcurrentLinkedDeque<E> queue;
Node<E> current; // current node; null until initialized
int batch; // batch size for splits
boolean exhausted; // true when no more nodes
- CLDSpliterator(ConcurrentLinkedDeque<E> queue) {
- this.queue = queue;
- }
public Spliterator<E> trySplit() {
Node<E> p;
- final ConcurrentLinkedDeque<E> q = this.queue;
int b = batch;
int n = (b <= 0) ? 1 : (b >= MAX_BATCH) ? MAX_BATCH : b + 1;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null)) {
+ ((p = current) != null || (p = first()) != null)) {
if (p.item == null && p == (p = p.next))
- current = p = q.first();
+ current = p = first();
if (p != null && p.next != null) {
Object[] a = new Object[n];
int i = 0;
@@ -1428,7 +1430,7 @@
if ((a[i] = p.item) != null)
++i;
if (p == (p = p.next))
- p = q.first();
+ p = first();
} while (p != null && i < n);
if ((current = p) == null)
exhausted = true;
@@ -1447,14 +1449,13 @@
public void forEachRemaining(Consumer<? super E> action) {
Node<E> p;
if (action == null) throw new NullPointerException();
- final ConcurrentLinkedDeque<E> q = this.queue;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null)) {
+ ((p = current) != null || (p = first()) != null)) {
exhausted = true;
do {
E e = p.item;
if (p == (p = p.next))
- p = q.first();
+ p = first();
if (e != null)
action.accept(e);
} while (p != null);
@@ -1464,14 +1465,13 @@
public boolean tryAdvance(Consumer<? super E> action) {
Node<E> p;
if (action == null) throw new NullPointerException();
- final ConcurrentLinkedDeque<E> q = this.queue;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null)) {
+ ((p = current) != null || (p = first()) != null)) {
E e;
do {
e = p.item;
if (p == (p = p.next))
- p = q.first();
+ p = first();
} while (e == null && p != null);
if ((current = p) == null)
exhausted = true;
@@ -1508,7 +1508,7 @@
* @since 1.8
*/
public Spliterator<E> spliterator() {
- return new CLDSpliterator<E>(this);
+ return new CLDSpliterator();
}
/**
@@ -1527,8 +1527,8 @@
// Write out all elements in the proper order.
for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null)
+ final E item;
+ if ((item = p.item) != null)
s.writeObject(item);
}
@@ -1563,6 +1563,57 @@
initHeadTail(h, t);
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean removeIf(Predicate<? super E> filter) {
+ Objects.requireNonNull(filter);
+ return bulkRemove(filter);
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean removeAll(Collection<?> c) {
+ Objects.requireNonNull(c);
+ return bulkRemove(e -> c.contains(e));
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean retainAll(Collection<?> c) {
+ Objects.requireNonNull(c);
+ return bulkRemove(e -> !c.contains(e));
+ }
+
+ /** Implementation of bulk remove methods. */
+ private boolean bulkRemove(Predicate<? super E> filter) {
+ boolean removed = false;
+ for (Node<E> p = first(), succ; p != null; p = succ) {
+ succ = succ(p);
+ final E item;
+ if ((item = p.item) != null
+ && filter.test(item)
+ && ITEM.compareAndSet(p, item, null)) {
+ unlink(p);
+ removed = true;
+ }
+ }
+ return removed;
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public void forEach(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ E item;
+ for (Node<E> p = first(); p != null; p = succ(p))
+ if ((item = p.item) != null)
+ action.accept(item);
+ }
+
// VarHandle mechanics
private static final VarHandle HEAD;
private static final VarHandle TAIL;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -47,6 +47,7 @@
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
+import java.util.function.Predicate;
/**
* An unbounded thread-safe {@linkplain Queue queue} based on linked nodes.
@@ -112,7 +113,7 @@
/*
* This is a modification of the Michael & Scott algorithm,
* adapted for a garbage-collected environment, with support for
- * interior node deletion (to support remove(Object)). For
+ * interior node deletion (to support e.g. remove(Object)). For
* explanation, read the paper.
*
* Note that like most non-blocking algorithms in this package,
@@ -160,12 +161,13 @@
* it is possible for tail to lag behind head (why not)?
*
* CASing a Node's item reference to null atomically removes the
- * element from the queue. Iterators skip over Nodes with null
- * items. Prior implementations of this class had a race between
- * poll() and remove(Object) where the same element would appear
- * to be successfully removed by two concurrent operations. The
- * method remove(Object) also lazily unlinks deleted Nodes, but
- * this is merely an optimization.
+ * element from the queue, leaving a "dead" node that should later
+ * be unlinked (but unlinking is merely an optimization).
+ * Interior element removal methods (other than Iterator.remove())
+ * keep track of the predecessor node during traversal so that the
+ * node can be CAS-unlinked. Some traversal methods try to unlink
+ * any deleted nodes encountered during traversal. See comments
+ * in bulkRemove.
*
* When constructing a Node (before enqueuing it) we avoid paying
* for a volatile write to item. This allows the cost of enqueue
@@ -290,6 +292,21 @@
}
/**
+ * Tries to CAS pred.next (or head, if pred is null) from c to p.
+ */
+ private boolean tryCasSuccessor(Node<E> pred, Node<E> c, Node<E> p) {
+ // assert c.item == null;
+ // assert c != p;
+ if (pred != null)
+ return NEXT.compareAndSet(pred, c, p);
+ if (HEAD.compareAndSet(this, c, p)) {
+ NEXT.setRelease(c, c);
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Inserts the specified element at the tail of this queue.
* As the queue is unbounded, this method will never return {@code false}.
*
@@ -326,12 +343,11 @@
}
public E poll() {
- restartFromHead:
- for (;;) {
- for (Node<E> h = head, p = h, q;;) {
- E item = p.item;
-
- if (item != null && ITEM.compareAndSet(p, item, null)) {
+ restartFromHead: for (;;) {
+ for (Node<E> h = head, p = h, q;; p = q) {
+ final E item;
+ if ((item = p.item) != null
+ && ITEM.compareAndSet(p, item, null)) {
// Successful CAS is the linearization point
// for item to be removed from this queue.
if (p != h) // hop two nodes at a time
@@ -344,25 +360,21 @@
}
else if (p == q)
continue restartFromHead;
- else
- p = q;
}
}
}
public E peek() {
- restartFromHead:
- for (;;) {
- for (Node<E> h = head, p = h, q;;) {
- E item = p.item;
- if (item != null || (q = p.next) == null) {
+ restartFromHead: for (;;) {
+ for (Node<E> h = head, p = h, q;; p = q) {
+ final E item;
+ if ((item = p.item) != null
+ || (q = p.next) == null) {
updateHead(h, p);
return item;
}
else if (p == q)
continue restartFromHead;
- else
- p = q;
}
}
}
@@ -376,9 +388,8 @@
* of losing a race to a concurrent poll().
*/
Node<E> first() {
- restartFromHead:
- for (;;) {
- for (Node<E> h = head, p = h, q;;) {
+ restartFromHead: for (;;) {
+ for (Node<E> h = head, p = h, q;; p = q) {
boolean hasItem = (p.item != null);
if (hasItem || (q = p.next) == null) {
updateHead(h, p);
@@ -386,8 +397,6 @@
}
else if (p == q)
continue restartFromHead;
- else
- p = q;
}
}
}
@@ -440,14 +449,24 @@
* @return {@code true} if this queue contains the specified element
*/
public boolean contains(Object o) {
- if (o != null) {
- for (Node<E> p = first(); p != null; p = succ(p)) {
- E item = p.item;
- if (item != null && o.equals(item))
+ if (o == null) return false;
+ restartFromHead: for (;;) {
+ for (Node<E> p = head, c = p, pred = null, q; p != null; p = q) {
+ final E item;
+ if ((item = p.item) != null && o.equals(item))
return true;
+ if (c != p && tryCasSuccessor(pred, c, p))
+ c = p;
+ q = p.next;
+ if (item != null || c != p) {
+ pred = p;
+ c = q;
+ }
+ else if (p == q)
+ continue restartFromHead;
}
+ return false;
}
- return false;
}
/**
@@ -462,27 +481,28 @@
* @return {@code true} if this queue changed as a result of the call
*/
public boolean remove(Object o) {
- if (o != null) {
- Node<E> next, pred = null;
- for (Node<E> p = first(); p != null; pred = p, p = next) {
- boolean removed = false;
- E item = p.item;
- if (item != null) {
- if (!o.equals(item)) {
- next = succ(p);
- continue;
- }
- removed = ITEM.compareAndSet(p, item, null);
- }
-
- next = succ(p);
- if (pred != null && next != null) // unlink
- NEXT.weakCompareAndSet(pred, p, next);
+ if (o == null) return false;
+ restartFromHead: for (;;) {
+ for (Node<E> p = head, c = p, pred = null, q; p != null; p = q) {
+ final E item;
+ final boolean removed =
+ (item = p.item) != null
+ && o.equals(item)
+ && ITEM.compareAndSet(p, item, null);
+ if (c != p && tryCasSuccessor(pred, c, p))
+ c = p;
if (removed)
return true;
+ q = p.next;
+ if (item != null || c != p) {
+ pred = p;
+ c = q;
+ }
+ else if (p == q)
+ continue restartFromHead;
}
+ return false;
}
- return false;
}
/**
@@ -553,8 +573,8 @@
int charLength = 0;
int size = 0;
for (Node<E> p = first(); p != null;) {
- E item = p.item;
- if (item != null) {
+ final E item;
+ if ((item = p.item) != null) {
if (a == null)
a = new String[4];
else if (size == a.length)
@@ -579,8 +599,8 @@
restartFromHead: for (;;) {
int size = 0;
for (Node<E> p = first(); p != null;) {
- E item = p.item;
- if (item != null) {
+ final E item;
+ if ((item = p.item) != null) {
if (x == null)
x = new Object[4];
else if (size == x.length)
@@ -697,7 +717,7 @@
restartFromHead: for (;;) {
Node<E> h, p, q;
for (p = h = head;; p = q) {
- E item;
+ final E item;
if ((item = p.item) != null) {
nextNode = p;
nextItem = item;
@@ -762,8 +782,8 @@
// Write out all elements in the proper order.
for (Node<E> p = first(); p != null; p = succ(p)) {
- Object item = p.item;
- if (item != null)
+ final E item;
+ if ((item = p.item) != null)
s.writeObject(item);
}
@@ -801,23 +821,18 @@
}
/** A customized variant of Spliterators.IteratorSpliterator */
- static final class CLQSpliterator<E> implements Spliterator<E> {
+ final class CLQSpliterator implements Spliterator<E> {
static final int MAX_BATCH = 1 << 25; // max batch array size;
- final ConcurrentLinkedQueue<E> queue;
Node<E> current; // current node; null until initialized
int batch; // batch size for splits
boolean exhausted; // true when no more nodes
- CLQSpliterator(ConcurrentLinkedQueue<E> queue) {
- this.queue = queue;
- }
public Spliterator<E> trySplit() {
Node<E> p;
- final ConcurrentLinkedQueue<E> q = this.queue;
int b = batch;
int n = (b <= 0) ? 1 : (b >= MAX_BATCH) ? MAX_BATCH : b + 1;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null) &&
+ ((p = current) != null || (p = first()) != null) &&
p.next != null) {
Object[] a = new Object[n];
int i = 0;
@@ -825,7 +840,7 @@
if ((a[i] = p.item) != null)
++i;
if (p == (p = p.next))
- p = q.first();
+ p = first();
} while (p != null && i < n);
if ((current = p) == null)
exhausted = true;
@@ -843,14 +858,13 @@
public void forEachRemaining(Consumer<? super E> action) {
Node<E> p;
if (action == null) throw new NullPointerException();
- final ConcurrentLinkedQueue<E> q = this.queue;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null)) {
+ ((p = current) != null || (p = first()) != null)) {
exhausted = true;
do {
E e = p.item;
if (p == (p = p.next))
- p = q.first();
+ p = first();
if (e != null)
action.accept(e);
} while (p != null);
@@ -860,14 +874,13 @@
public boolean tryAdvance(Consumer<? super E> action) {
Node<E> p;
if (action == null) throw new NullPointerException();
- final ConcurrentLinkedQueue<E> q = this.queue;
if (!exhausted &&
- ((p = current) != null || (p = q.first()) != null)) {
+ ((p = current) != null || (p = first()) != null)) {
E e;
do {
e = p.item;
if (p == (p = p.next))
- p = q.first();
+ p = first();
} while (e == null && p != null);
if ((current = p) == null)
exhausted = true;
@@ -905,7 +918,100 @@
*/
@Override
public Spliterator<E> spliterator() {
- return new CLQSpliterator<E>(this);
+ return new CLQSpliterator();
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean removeIf(Predicate<? super E> filter) {
+ Objects.requireNonNull(filter);
+ return bulkRemove(filter);
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean removeAll(Collection<?> c) {
+ Objects.requireNonNull(c);
+ return bulkRemove(e -> c.contains(e));
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public boolean retainAll(Collection<?> c) {
+ Objects.requireNonNull(c);
+ return bulkRemove(e -> !c.contains(e));
+ }
+
+ public void clear() {
+ bulkRemove(e -> true);
+ }
+
+ /**
+ * Tolerate this many consecutive dead nodes before CAS-collapsing.
+ * Amortized cost of clear() is (1 + 1/MAX_HOPS) CASes per element.
+ */
+ private static final int MAX_HOPS = 8;
+
+ /** Implementation of bulk remove methods. */
+ private boolean bulkRemove(Predicate<? super E> filter) {
+ boolean removed = false;
+ restartFromHead: for (;;) {
+ int hops = MAX_HOPS;
+ // c will be CASed to collapse intervening dead nodes between
+ // pred (or head if null) and p.
+ for (Node<E> p = head, c = p, pred = null, q; p != null; p = q) {
+ final E item; boolean pAlive;
+ if (pAlive = ((item = p.item) != null)) {
+ if (filter.test(item)) {
+ if (ITEM.compareAndSet(p, item, null))
+ removed = true;
+ pAlive = false;
+ }
+ }
+ if ((q = p.next) == null || pAlive || --hops == 0) {
+ // p might already be self-linked here, but if so:
+ // - CASing head will surely fail
+ // - CASing pred's next will be useless but harmless.
+ if (c != p && tryCasSuccessor(pred, c, p))
+ c = p;
+ // if c != p, CAS failed, so abandon old pred
+ if (pAlive || c != p) {
+ hops = MAX_HOPS;
+ pred = p;
+ c = q;
+ }
+ } else if (p == q)
+ continue restartFromHead;
+ }
+ return removed;
+ }
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public void forEach(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ restartFromHead: for (;;) {
+ for (Node<E> p = head, c = p, pred = null, q; p != null; p = q) {
+ final E item;
+ if ((item = p.item) != null)
+ action.accept(item);
+ if (c != p && tryCasSuccessor(pred, c, p))
+ c = p;
+ q = p.next;
+ if (item != null || c != p) {
+ pred = p;
+ c = q;
+ }
+ else if (p == q)
+ continue restartFromHead;
+ }
+ return;
+ }
}
// VarHandle mechanics
--- a/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Wed Jul 05 22:38:24 2017 +0200
@@ -793,6 +793,9 @@
}
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public void forEach(Consumer<? super E> action) {
if (action == null) throw new NullPointerException();
for (Object x : getArray()) {
@@ -801,6 +804,9 @@
}
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public boolean removeIf(Predicate<? super E> filter) {
if (filter == null) throw new NullPointerException();
return bulkRemove(filter);
--- a/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Wed Jul 05 22:38:24 2017 +0200
@@ -411,10 +411,16 @@
&& compareSets(al.getArray(), (Set<?>) o) == 0);
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public boolean removeIf(Predicate<? super E> filter) {
return al.removeIf(filter);
}
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
public void forEach(Consumer<? super E> action) {
al.forEach(action);
}
--- a/jdk/src/java.base/share/classes/java/util/concurrent/CyclicBarrier.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/CyclicBarrier.java Wed Jul 05 22:38:24 2017 +0200
@@ -149,7 +149,8 @@
* but no subsequent reset.
*/
private static class Generation {
- boolean broken; // initially false
+ Generation() {} // prevent access constructor creation
+ boolean broken; // initially false
}
/** The lock for guarding barrier entry */
--- a/jdk/src/java.base/share/classes/java/util/concurrent/DelayQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/DelayQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -547,8 +547,7 @@
public E next() {
if (cursor >= array.length)
throw new NoSuchElementException();
- lastRet = cursor;
- return (E)array[cursor++];
+ return (E)array[lastRet = cursor++];
}
public void remove() {
--- a/jdk/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java Wed Jul 05 22:38:24 2017 +0200
@@ -39,6 +39,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.locks.Condition;
@@ -740,8 +741,7 @@
* @throws IllegalArgumentException {@inheritDoc}
*/
public int drainTo(Collection<? super E> c, int maxElements) {
- if (c == null)
- throw new NullPointerException();
+ Objects.requireNonNull(c);
if (c == this)
throw new IllegalArgumentException();
if (maxElements <= 0)
@@ -986,6 +986,16 @@
}
/**
+ * Used for any element traversal that is not entirely under lock.
+ * Such traversals must handle both:
+ * - dequeued nodes (p.next == p)
+ * - (possibly multiple) interior removed nodes (p.item == null)
+ */
+ Node<E> succ(Node<E> p) {
+ return (p == (p = p.next)) ? first : p;
+ }
+
+ /**
* Returns an iterator over the elements in this deque in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
@@ -1024,8 +1034,8 @@
/**
* nextItem holds on to item fields because once we claim that
* an element exists in hasNext(), we must return item read
- * under lock (in advance()) even if it was in the process of
- * being removed when hasNext() was called.
+ * under lock even if it was in the process of being removed
+ * when hasNext() was called.
*/
E nextItem;
@@ -1038,48 +1048,17 @@
abstract Node<E> firstNode();
abstract Node<E> nextNode(Node<E> n);
+ private Node<E> succ(Node<E> p) {
+ return (p == (p = nextNode(p))) ? firstNode() : p;
+ }
+
AbstractItr() {
// set to initial position
final ReentrantLock lock = LinkedBlockingDeque.this.lock;
lock.lock();
try {
- next = firstNode();
- nextItem = (next == null) ? null : next.item;
- } finally {
- lock.unlock();
- }
- }
-
- /**
- * Returns the successor node of the given non-null, but
- * possibly previously deleted, node.
- */
- private Node<E> succ(Node<E> n) {
- // Chains of deleted nodes ending in null or self-links
- // are possible if multiple interior nodes are removed.
- for (;;) {
- Node<E> s = nextNode(n);
- if (s == null)
- return null;
- else if (s.item != null)
- return s;
- else if (s == n)
- return firstNode();
- else
- n = s;
- }
- }
-
- /**
- * Advances next.
- */
- void advance() {
- final ReentrantLock lock = LinkedBlockingDeque.this.lock;
- lock.lock();
- try {
- // assert next != null;
- next = succ(next);
- nextItem = (next == null) ? null : next.item;
+ if ((next = firstNode()) != null)
+ nextItem = next.item;
} finally {
lock.unlock();
}
@@ -1090,14 +1069,65 @@
}
public E next() {
- if (next == null)
+ Node<E> p;
+ if ((p = next) == null)
throw new NoSuchElementException();
- lastRet = next;
+ lastRet = p;
E x = nextItem;
- advance();
+ final ReentrantLock lock = LinkedBlockingDeque.this.lock;
+ lock.lock();
+ try {
+ E e = null;
+ for (p = nextNode(p); p != null && (e = p.item) == null; )
+ p = succ(p);
+ next = p;
+ nextItem = e;
+ } finally {
+ lock.unlock();
+ }
return x;
}
+ public void forEachRemaining(Consumer<? super E> action) {
+ // A variant of forEachFrom
+ Objects.requireNonNull(action);
+ Node<E> p;
+ if ((p = next) == null) return;
+ lastRet = p;
+ next = null;
+ final ReentrantLock lock = LinkedBlockingDeque.this.lock;
+ final int batchSize = 32;
+ Object[] es = null;
+ int n, len = 1;
+ do {
+ lock.lock();
+ try {
+ if (es == null) {
+ p = nextNode(p);
+ for (Node<E> q = p; q != null; q = succ(q))
+ if (q.item != null && ++len == batchSize)
+ break;
+ es = new Object[len];
+ es[0] = nextItem;
+ nextItem = null;
+ n = 1;
+ } else
+ n = 0;
+ for (; p != null && n < len; p = succ(p))
+ if ((es[n] = p.item) != null) {
+ lastRet = p;
+ n++;
+ }
+ } finally {
+ lock.unlock();
+ }
+ for (int i = 0; i < n; i++) {
+ @SuppressWarnings("unchecked") E e = (E) es[i];
+ action.accept(e);
+ }
+ } while (n > 0 && p != null);
+ }
+
public void remove() {
Node<E> n = lastRet;
if (n == null)
@@ -1116,25 +1146,30 @@
/** Forward iterator */
private class Itr extends AbstractItr {
+ Itr() {} // prevent access constructor creation
Node<E> firstNode() { return first; }
Node<E> nextNode(Node<E> n) { return n.next; }
}
/** Descending iterator */
private class DescendingItr extends AbstractItr {
+ DescendingItr() {} // prevent access constructor creation
Node<E> firstNode() { return last; }
Node<E> nextNode(Node<E> n) { return n.prev; }
}
- /** A customized variant of Spliterators.IteratorSpliterator */
+ /**
+ * A customized variant of Spliterators.IteratorSpliterator.
+ * Keep this class in sync with (very similar) LBQSpliterator.
+ */
private final class LBDSpliterator implements Spliterator<E> {
static final int MAX_BATCH = 1 << 25; // max batch array size;
Node<E> current; // current node; null until initialized
int batch; // batch size for splits
boolean exhausted; // true when no more nodes
- long est; // size estimate
+ long est = size(); // size estimate
- LBDSpliterator() { est = size(); }
+ LBDSpliterator() {}
public long estimateSize() { return est; }
@@ -1143,8 +1178,7 @@
int b = batch;
int n = (b <= 0) ? 1 : (b >= MAX_BATCH) ? MAX_BATCH : b + 1;
if (!exhausted &&
- (((h = current) != null && h != h.next)
- || (h = first) != null)
+ ((h = current) != null || (h = first) != null)
&& h.next != null) {
Object[] a = new Object[n];
final ReentrantLock lock = LinkedBlockingDeque.this.lock;
@@ -1152,10 +1186,10 @@
Node<E> p = current;
lock.lock();
try {
- if (((p != null && p != p.next) || (p = first) != null)
- && p.item != null)
- for (; p != null && i < n; p = p.next)
- a[i++] = p.item;
+ if (p != null || (p = first) != null)
+ for (; p != null && i < n; p = succ(p))
+ if ((a[i] = p.item) != null)
+ i++;
} finally {
lock.unlock();
}
@@ -1176,51 +1210,39 @@
return null;
}
- public void forEachRemaining(Consumer<? super E> action) {
- if (action == null) throw new NullPointerException();
- if (exhausted)
- return;
- exhausted = true;
- final ReentrantLock lock = LinkedBlockingDeque.this.lock;
- Node<E> p = current;
- current = null;
- do {
+ public boolean tryAdvance(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ if (!exhausted) {
E e = null;
+ final ReentrantLock lock = LinkedBlockingDeque.this.lock;
lock.lock();
try {
- if ((p != null && p != p.next) || (p = first) != null) {
- e = p.item;
- p = p.next;
- }
+ Node<E> p;
+ if ((p = current) != null || (p = first) != null)
+ do {
+ e = p.item;
+ p = succ(p);
+ } while (e == null && p != null);
+ exhausted = ((current = p) == null);
} finally {
lock.unlock();
}
- if (e != null)
+ if (e != null) {
action.accept(e);
- } while (p != null);
+ return true;
+ }
+ }
+ return false;
}
- public boolean tryAdvance(Consumer<? super E> action) {
- if (action == null) throw new NullPointerException();
- if (exhausted)
- return false;
- final ReentrantLock lock = LinkedBlockingDeque.this.lock;
- Node<E> p = current;
- E e = null;
- lock.lock();
- try {
- if ((p != null && p != p.next) || (p = first) != null) {
- e = p.item;
- p = p.next;
- }
- } finally {
- lock.unlock();
+ public void forEachRemaining(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ if (!exhausted) {
+ exhausted = true;
+ Node<E> p = current;
+ current = null;
+ forEachFrom(action, p);
}
- exhausted = ((current = p) == null);
- if (e == null)
- return false;
- action.accept(e);
- return true;
}
public int characteristics() {
@@ -1251,6 +1273,48 @@
}
/**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public void forEach(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ forEachFrom(action, null);
+ }
+
+ /**
+ * Runs action on each element found during a traversal starting at p.
+ * If p is null, traversal starts at head.
+ */
+ void forEachFrom(Consumer<? super E> action, Node<E> p) {
+ // Extract batches of elements while holding the lock; then
+ // run the action on the elements while not
+ final ReentrantLock lock = this.lock;
+ final int batchSize = 32; // max number of elements per batch
+ Object[] es = null; // container for batch of elements
+ int n, len = 0;
+ do {
+ lock.lock();
+ try {
+ if (es == null) {
+ if (p == null) p = first;
+ for (Node<E> q = p; q != null; q = succ(q))
+ if (q.item != null && ++len == batchSize)
+ break;
+ es = new Object[len];
+ }
+ for (n = 0; p != null && n < len; p = succ(p))
+ if ((es[n] = p.item) != null)
+ n++;
+ } finally {
+ lock.unlock();
+ }
+ for (int i = 0; i < n; i++) {
+ @SuppressWarnings("unchecked") E e = (E) es[i];
+ action.accept(e);
+ }
+ } while (n > 0 && p != null);
+ }
+
+ /**
* Saves this deque to a stream (that is, serializes it).
*
* @param s the stream
@@ -1290,8 +1354,7 @@
last = null;
// Read in all elements and place in queue
for (;;) {
- @SuppressWarnings("unchecked")
- E item = (E)s.readObject();
+ @SuppressWarnings("unchecked") E item = (E)s.readObject();
if (item == null)
break;
add(item);
--- a/jdk/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -39,6 +39,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.atomic.AtomicInteger;
@@ -234,14 +235,6 @@
putLock.unlock();
}
-// /**
-// * Tells whether both locks are held by current thread.
-// */
-// boolean isFullyLocked() {
-// return (putLock.isHeldByCurrentThread() &&
-// takeLock.isHeldByCurrentThread());
-// }
-
/**
* Creates a {@code LinkedBlockingQueue} with a capacity of
* {@link Integer#MAX_VALUE}.
@@ -517,7 +510,8 @@
* Unlinks interior Node p with predecessor trail.
*/
void unlink(Node<E> p, Node<E> trail) {
- // assert isFullyLocked();
+ // assert putLock.isHeldByCurrentThread();
+ // assert takeLock.isHeldByCurrentThread();
// p.next is not changed, to allow iterators that are
// traversing p to maintain their weak-consistency guarantee.
p.item = null;
@@ -701,8 +695,7 @@
* @throws IllegalArgumentException {@inheritDoc}
*/
public int drainTo(Collection<? super E> c, int maxElements) {
- if (c == null)
- throw new NullPointerException();
+ Objects.requireNonNull(c);
if (c == this)
throw new IllegalArgumentException();
if (maxElements <= 0)
@@ -741,6 +734,16 @@
}
/**
+ * Used for any element traversal that is not entirely under lock.
+ * Such traversals must handle both:
+ * - dequeued nodes (p.next == p)
+ * - (possibly multiple) interior removed nodes (p.item == null)
+ */
+ Node<E> succ(Node<E> p) {
+ return (p == (p = p.next)) ? head.next : p;
+ }
+
+ /**
* Returns an iterator over the elements in this queue in proper sequence.
* The elements will be returned in order from first (head) to last (tail).
*
@@ -760,48 +763,80 @@
* still have it to return even if lost race with a take etc.
*/
- private Node<E> current;
+ private Node<E> next;
+ private E nextItem;
private Node<E> lastRet;
- private E currentElement;
Itr() {
fullyLock();
try {
- current = head.next;
- if (current != null)
- currentElement = current.item;
+ if ((next = head.next) != null)
+ nextItem = next.item;
} finally {
fullyUnlock();
}
}
public boolean hasNext() {
- return current != null;
+ return next != null;
}
public E next() {
+ Node<E> p;
+ if ((p = next) == null)
+ throw new NoSuchElementException();
+ lastRet = p;
+ E x = nextItem;
fullyLock();
try {
- if (current == null)
- throw new NoSuchElementException();
- lastRet = current;
- E item = null;
- // Unlike other traversal methods, iterators must handle both:
- // - dequeued nodes (p.next == p)
- // - (possibly multiple) interior removed nodes (p.item == null)
- for (Node<E> p = current, q;; p = q) {
- if ((q = p.next) == p)
- q = head.next;
- if (q == null || (item = q.item) != null) {
- current = q;
- E x = currentElement;
- currentElement = item;
- return x;
- }
- }
+ E e = null;
+ for (p = p.next; p != null && (e = p.item) == null; )
+ p = succ(p);
+ next = p;
+ nextItem = e;
} finally {
fullyUnlock();
}
+ return x;
+ }
+
+ public void forEachRemaining(Consumer<? super E> action) {
+ // A variant of forEachFrom
+ Objects.requireNonNull(action);
+ Node<E> p;
+ if ((p = next) == null) return;
+ lastRet = p;
+ next = null;
+ final int batchSize = 32;
+ Object[] es = null;
+ int n, len = 1;
+ do {
+ fullyLock();
+ try {
+ if (es == null) {
+ p = p.next;
+ for (Node<E> q = p; q != null; q = succ(q))
+ if (q.item != null && ++len == batchSize)
+ break;
+ es = new Object[len];
+ es[0] = nextItem;
+ nextItem = null;
+ n = 1;
+ } else
+ n = 0;
+ for (; p != null && n < len; p = succ(p))
+ if ((es[n] = p.item) != null) {
+ lastRet = p;
+ n++;
+ }
+ } finally {
+ fullyUnlock();
+ }
+ for (int i = 0; i < n; i++) {
+ @SuppressWarnings("unchecked") E e = (E) es[i];
+ action.accept(e);
+ }
+ } while (n > 0 && p != null);
}
public void remove() {
@@ -825,42 +860,39 @@
}
}
- /** A customized variant of Spliterators.IteratorSpliterator */
- static final class LBQSpliterator<E> implements Spliterator<E> {
+ /**
+ * A customized variant of Spliterators.IteratorSpliterator.
+ * Keep this class in sync with (very similar) LBDSpliterator.
+ */
+ private final class LBQSpliterator implements Spliterator<E> {
static final int MAX_BATCH = 1 << 25; // max batch array size;
- final LinkedBlockingQueue<E> queue;
Node<E> current; // current node; null until initialized
int batch; // batch size for splits
boolean exhausted; // true when no more nodes
- long est; // size estimate
- LBQSpliterator(LinkedBlockingQueue<E> queue) {
- this.queue = queue;
- this.est = queue.size();
- }
+ long est = size(); // size estimate
+
+ LBQSpliterator() {}
public long estimateSize() { return est; }
public Spliterator<E> trySplit() {
Node<E> h;
- final LinkedBlockingQueue<E> q = this.queue;
int b = batch;
int n = (b <= 0) ? 1 : (b >= MAX_BATCH) ? MAX_BATCH : b + 1;
if (!exhausted &&
- ((h = current) != null || (h = q.head.next) != null) &&
- h.next != null) {
+ ((h = current) != null || (h = head.next) != null)
+ && h.next != null) {
Object[] a = new Object[n];
int i = 0;
Node<E> p = current;
- q.fullyLock();
+ fullyLock();
try {
- if (p != null || (p = q.head.next) != null) {
- do {
+ if (p != null || (p = head.next) != null)
+ for (; p != null && i < n; p = succ(p))
if ((a[i] = p.item) != null)
- ++i;
- } while ((p = p.next) != null && i < n);
- }
+ i++;
} finally {
- q.fullyUnlock();
+ fullyUnlock();
}
if ((current = p) == null) {
est = 0L;
@@ -879,53 +911,22 @@
return null;
}
- public void forEachRemaining(Consumer<? super E> action) {
- if (action == null) throw new NullPointerException();
- final LinkedBlockingQueue<E> q = this.queue;
- if (!exhausted) {
- exhausted = true;
- Node<E> p = current;
- do {
- E e = null;
- q.fullyLock();
- try {
- if (p == null)
- p = q.head.next;
- while (p != null) {
- e = p.item;
- p = p.next;
- if (e != null)
- break;
- }
- } finally {
- q.fullyUnlock();
- }
- if (e != null)
- action.accept(e);
- } while (p != null);
- }
- }
-
public boolean tryAdvance(Consumer<? super E> action) {
- if (action == null) throw new NullPointerException();
- final LinkedBlockingQueue<E> q = this.queue;
+ Objects.requireNonNull(action);
if (!exhausted) {
E e = null;
- q.fullyLock();
+ fullyLock();
try {
- if (current == null)
- current = q.head.next;
- while (current != null) {
- e = current.item;
- current = current.next;
- if (e != null)
- break;
- }
+ Node<E> p;
+ if ((p = current) != null || (p = head.next) != null)
+ do {
+ e = p.item;
+ p = succ(p);
+ } while (e == null && p != null);
+ exhausted = ((current = p) == null);
} finally {
- q.fullyUnlock();
+ fullyUnlock();
}
- if (current == null)
- exhausted = true;
if (e != null) {
action.accept(e);
return true;
@@ -934,9 +935,20 @@
return false;
}
+ public void forEachRemaining(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ if (!exhausted) {
+ exhausted = true;
+ Node<E> p = current;
+ current = null;
+ forEachFrom(action, p);
+ }
+ }
+
public int characteristics() {
- return Spliterator.ORDERED | Spliterator.NONNULL |
- Spliterator.CONCURRENT;
+ return (Spliterator.ORDERED |
+ Spliterator.NONNULL |
+ Spliterator.CONCURRENT);
}
}
@@ -957,7 +969,48 @@
* @since 1.8
*/
public Spliterator<E> spliterator() {
- return new LBQSpliterator<E>(this);
+ return new LBQSpliterator();
+ }
+
+ /**
+ * @throws NullPointerException {@inheritDoc}
+ */
+ public void forEach(Consumer<? super E> action) {
+ Objects.requireNonNull(action);
+ forEachFrom(action, null);
+ }
+
+ /**
+ * Runs action on each element found during a traversal starting at p.
+ * If p is null, traversal starts at head.
+ */
+ void forEachFrom(Consumer<? super E> action, Node<E> p) {
+ // Extract batches of elements while holding the lock; then
+ // run the action on the elements while not
+ final int batchSize = 32; // max number of elements per batch
+ Object[] es = null; // container for batch of elements
+ int n, len = 0;
+ do {
+ fullyLock();
+ try {
+ if (es == null) {
+ if (p == null) p = head.next;
+ for (Node<E> q = p; q != null; q = succ(q))
+ if (q.item != null && ++len == batchSize)
+ break;
+ es = new Object[len];
+ }
+ for (n = 0; p != null && n < len; p = succ(p))
+ if ((es[n] = p.item) != null)
+ n++;
+ } finally {
+ fullyUnlock();
+ }
+ for (int i = 0; i < n; i++) {
+ @SuppressWarnings("unchecked") E e = (E) es[i];
+ action.accept(e);
+ }
+ } while (n > 0 && p != null);
}
/**
--- a/jdk/src/java.base/share/classes/java/util/concurrent/Phaser.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/Phaser.java Wed Jul 05 22:38:24 2017 +0200
@@ -179,7 +179,7 @@
* void startTasks(List<Runnable> tasks, int iterations) {
* Phaser phaser = new Phaser() {
* protected boolean onAdvance(int phase, int registeredParties) {
- * return phase >= iterations || registeredParties == 0;
+ * return phase >= iterations - 1 || registeredParties == 0;
* }
* };
* phaser.register();
--- a/jdk/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java Wed Jul 05 22:38:24 2017 +0200
@@ -345,11 +345,9 @@
* promoting x up the tree until it is greater than or equal to
* its parent, or is the root.
*
- * To simplify and speed up coercions and comparisons. the
+ * To simplify and speed up coercions and comparisons, the
* Comparable and Comparator versions are separated into different
* methods that are otherwise identical. (Similarly for siftDown.)
- * These methods are static, with heap state as arguments, to
- * simplify use in light of possible comparator exceptions.
*
* @param k the position to fill
* @param x the item to insert
@@ -435,6 +433,7 @@
/**
* Establishes the heap invariant (described above) in the entire tree,
* assuming nothing about the order of the elements prior to the call.
+ * This classic algorithm due to Floyd (1964) is known to be O(size).
*/
private void heapify() {
Object[] array = queue;
@@ -878,8 +877,7 @@
public E next() {
if (cursor >= array.length)
throw new NoSuchElementException();
- lastRet = cursor;
- return (E)array[cursor++];
+ return (E)array[lastRet = cursor++];
}
public void remove() {
@@ -936,15 +934,12 @@
/**
* Immutable snapshot spliterator that binds to elements "late".
*/
- static final class PBQSpliterator<E> implements Spliterator<E> {
- final PriorityBlockingQueue<E> queue;
+ final class PBQSpliterator implements Spliterator<E> {
Object[] array;
int index;
int fence;
- PBQSpliterator(PriorityBlockingQueue<E> queue, Object[] array,
- int index, int fence) {
- this.queue = queue;
+ PBQSpliterator(Object[] array, int index, int fence) {
this.array = array;
this.index = index;
this.fence = fence;
@@ -953,14 +948,14 @@
final int getFence() {
int hi;
if ((hi = fence) < 0)
- hi = fence = (array = queue.toArray()).length;
+ hi = fence = (array = toArray()).length;
return hi;
}
- public PBQSpliterator<E> trySplit() {
+ public PBQSpliterator trySplit() {
int hi = getFence(), lo = index, mid = (lo + hi) >>> 1;
return (lo >= mid) ? null :
- new PBQSpliterator<E>(queue, array, lo, index = mid);
+ new PBQSpliterator(array, lo, index = mid);
}
@SuppressWarnings("unchecked")
@@ -969,7 +964,7 @@
if (action == null)
throw new NullPointerException();
if ((a = array) == null)
- fence = (a = queue.toArray()).length;
+ fence = (a = toArray()).length;
if ((hi = fence) <= a.length &&
(i = index) >= 0 && i < (index = hi)) {
do { action.accept((E)a[i]); } while (++i < hi);
@@ -987,7 +982,7 @@
return false;
}
- public long estimateSize() { return (long)(getFence() - index); }
+ public long estimateSize() { return getFence() - index; }
public int characteristics() {
return Spliterator.NONNULL | Spliterator.SIZED | Spliterator.SUBSIZED;
@@ -1012,7 +1007,7 @@
* @since 1.8
*/
public Spliterator<E> spliterator() {
- return new PBQSpliterator<E>(this, null, 0, -1);
+ return new PBQSpliterator(null, 0, -1);
}
// VarHandle mechanics
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java Wed Jul 05 22:38:24 2017 +0200
@@ -1306,8 +1306,7 @@
public Runnable next() {
if (cursor >= array.length)
throw new NoSuchElementException();
- lastRet = cursor;
- return array[cursor++];
+ return array[lastRet = cursor++];
}
public void remove() {
--- a/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/SubmissionPublisher.java Wed Jul 05 22:38:24 2017 +0200
@@ -195,6 +195,7 @@
/** Fallback if ForkJoinPool.commonPool() cannot support parallelism */
private static final class ThreadPerTaskExecutor implements Executor {
+ ThreadPerTaskExecutor() {} // prevent access constructor creation
public void execute(Runnable r) { new Thread(r).start(); }
}
@@ -1454,7 +1455,17 @@
*/
private boolean checkControl(Flow.Subscriber<? super T> s, int c) {
boolean stat = true;
- if ((c & ERROR) != 0) {
+ if ((c & SUBSCRIBE) != 0) {
+ if (CTL.compareAndSet(this, c, c & ~SUBSCRIBE)) {
+ try {
+ if (s != null)
+ s.onSubscribe(this);
+ } catch (Throwable ex) {
+ onError(ex);
+ }
+ }
+ }
+ else if ((c & ERROR) != 0) {
Throwable ex = pendingError;
ctl = DISABLED; // no need for CAS
if (ex != null) { // null if errorless cancel
@@ -1465,16 +1476,6 @@
}
}
}
- else if ((c & SUBSCRIBE) != 0) {
- if (CTL.compareAndSet(this, c, c & ~SUBSCRIBE)) {
- try {
- if (s != null)
- s.onSubscribe(this);
- } catch (Throwable ex) {
- onError(ex);
- }
- }
- }
else {
detach();
stat = false;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/locks/ReentrantReadWriteLock.java Wed Jul 05 22:38:24 2017 +0200
@@ -138,7 +138,7 @@
* <pre> {@code
* class CachedData {
* Object data;
- * volatile boolean cacheValid;
+ * boolean cacheValid;
* final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
*
* void processCachedData() {
--- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLEngine.java Wed Jul 05 22:38:24 2017 +0200
@@ -1338,7 +1338,7 @@
/**
* Registers a callback function that selects an application protocol
* value for a SSL/TLS/DTLS handshake.
- * The function overrides any values set using
+ * The function overrides any values supplied using
* {@link SSLParameters#setApplicationProtocols
* SSLParameters.setApplicationProtocols} and it supports the following
* type parameters:
@@ -1354,6 +1354,8 @@
* <dt> {@code String}
* <dd> The function's result is an application protocol name, or null to
* indicate that none of the advertised names are acceptable.
+ * If the return value is an empty {@code String} then application
+ * protocol indications will not be used.
* If the return value is null (no value chosen) or is a value that
* was not advertised by the peer, the underlying protocol will
* determine what action to take. (For example, ALPN will send a
--- a/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/SSLSocket.java Wed Jul 05 22:38:24 2017 +0200
@@ -749,7 +749,7 @@
/**
* Registers a callback function that selects an application protocol
* value for a SSL/TLS/DTLS handshake.
- * The function overrides any values set using
+ * The function overrides any values supplied using
* {@link SSLParameters#setApplicationProtocols
* SSLParameters.setApplicationProtocols} and it supports the following
* type parameters:
@@ -765,6 +765,8 @@
* <dt> {@code String}
* <dd> The function's result is an application protocol name, or null to
* indicate that none of the advertised names are acceptable.
+ * If the return value is an empty {@code String} then application
+ * protocol indications will not be used.
* If the return value is null (no value chosen) or is a value that
* was not advertised by the peer, the underlying protocol will
* determine what action to take. (For example, ALPN will send a
--- a/jdk/src/java.base/share/classes/sun/nio/ch/SocketAdaptor.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/nio/ch/SocketAdaptor.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -31,7 +31,7 @@
import java.nio.channels.*;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
-
+import java.util.concurrent.TimeUnit;
// Make a socket channel look like a socket.
//
@@ -99,17 +99,19 @@
try {
if (sc.connect(remote))
return;
- long to = timeout;
+ long timeoutNanos =
+ TimeUnit.NANOSECONDS.convert(timeout,
+ TimeUnit.MILLISECONDS);
for (;;) {
if (!sc.isOpen())
throw new ClosedChannelException();
- long st = System.currentTimeMillis();
+ long startTime = System.nanoTime();
- int result = sc.poll(Net.POLLCONN, to);
+ int result = sc.poll(Net.POLLCONN, timeout);
if (result > 0 && sc.finishConnect())
break;
- to -= System.currentTimeMillis() - st;
- if (to <= 0) {
+ timeoutNanos -= System.nanoTime() - startTime;
+ if (timeoutNanos <= 0) {
try {
sc.close();
} catch (IOException x) { }
@@ -194,18 +196,20 @@
int n;
if ((n = sc.read(bb)) != 0)
return n;
- long to = timeout;
+ long timeoutNanos =
+ TimeUnit.NANOSECONDS.convert(timeout,
+ TimeUnit.MILLISECONDS);
for (;;) {
if (!sc.isOpen())
throw new ClosedChannelException();
- long st = System.currentTimeMillis();
- int result = sc.poll(Net.POLLIN, to);
+ long startTime = System.nanoTime();
+ int result = sc.poll(Net.POLLIN, timeout);
if (result > 0) {
if ((n = sc.read(bb)) != 0)
return n;
}
- to -= System.currentTimeMillis() - st;
- if (to <= 0)
+ timeoutNanos -= System.nanoTime() - startTime;
+ if (timeoutNanos <= 0)
throw new SocketTimeoutException();
}
} finally {
--- a/jdk/src/java.base/share/classes/sun/security/provider/CtrDrbg.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/CtrDrbg.java Wed Jul 05 22:38:24 2017 +0200
@@ -80,7 +80,7 @@
@Override
protected void chooseAlgorithmAndStrength() {
if (requestedAlgorithm != null) {
- algorithm = requestedAlgorithm.toUpperCase();
+ algorithm = requestedAlgorithm.toUpperCase(Locale.ROOT);
int supportedStrength = alg2strength(algorithm);
if (requestedInstantiationSecurityStrength >= 0) {
int tryStrength = getStandardStrength(
--- a/jdk/src/java.base/share/classes/sun/security/x509/AlgorithmId.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AlgorithmId.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -1009,7 +1009,7 @@
* @return the default alg, might be null if unsupported
*/
public static String getDefaultSigAlgForKey(PrivateKey k) {
- switch (k.getAlgorithm().toUpperCase()) {
+ switch (k.getAlgorithm().toUpperCase(Locale.ROOT)) {
case "EC":
return ecStrength(KeyUtil.getKeySize(k))
+ "withECDSA";
--- a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Wed Jul 05 22:38:24 2017 +0200
@@ -39,10 +39,6 @@
#include <dlfcn.h>
#include <limits.h>
-#if defined(__solaris__) && !defined(NAME_MAX)
-#define NAME_MAX MAXNAMLEN
-#endif
-
#include "jni.h"
#include "jni_util.h"
#include "jlong.h"
@@ -52,13 +48,26 @@
#include "java_io_FileSystem.h"
#include "java_io_UnixFileSystem.h"
+#if defined(_AIX)
+ #if !defined(NAME_MAX)
+ #define NAME_MAX MAXNAMLEN
+ #endif
+ #define DIR DIR64
+ #define opendir opendir64
+ #define closedir closedir64
+#endif
+
+#if defined(__solaris__) && !defined(NAME_MAX)
+ #define NAME_MAX MAXNAMLEN
+#endif
+
#if defined(_ALLBSD_SOURCE)
-#define dirent64 dirent
-#define readdir64_r readdir_r
-#define stat64 stat
-#ifndef MACOSX
-#define statvfs64 statvfs
-#endif
+ #define dirent64 dirent
+ #define readdir64_r readdir_r
+ #define stat64 stat
+ #ifndef MACOSX
+ #define statvfs64 statvfs
+ #endif
#endif
/* -- Field IDs -- */
--- a/jdk/src/java.base/unix/native/libjava/childproc.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/unix/native/libjava/childproc.c Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -62,15 +62,18 @@
return c >= '0' && c <= '9';
}
-#ifdef _ALLBSD_SOURCE
-#define FD_DIR "/dev/fd"
-#define dirent64 dirent
-#define readdir64 readdir
-#elif defined(_AIX)
-/* AIX does not understand '/proc/self' - it requires the real process ID */
-#define FD_DIR aix_fd_dir
+#if defined(_AIX)
+ /* AIX does not understand '/proc/self' - it requires the real process ID */
+ #define FD_DIR aix_fd_dir
+ #define DIR DIR64
+ #define opendir opendir64
+ #define closedir closedir64
+#elif defined(_ALLBSD_SOURCE)
+ #define FD_DIR "/dev/fd"
+ #define dirent64 dirent
+ #define readdir64 readdir
#else
-#define FD_DIR "/proc/self/fd"
+ #define FD_DIR "/proc/self/fd"
#endif
int
--- a/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Wed Jul 05 22:38:24 2017 +0200
@@ -219,6 +219,8 @@
netif *ifs, *curr;
jboolean isCopy;
const char* name_utf;
+ char *colonP;
+ char searchName[IFNAMESIZE];
jobject obj = NULL;
if (name != NULL) {
@@ -239,15 +241,33 @@
return NULL;
}
- // search the list of interfaces based on name
+ // search the list of interfaces based on name,
+ // if it is virtual sub interface search with parent first.
+ strncpy(searchName, name_utf, IFNAMESIZE);
+ searchName[IFNAMESIZE - 1] = '\0';
+ colonP = strchr(searchName, ':');
+ if (colonP != NULL) {
+ *colonP = '\0';
+ }
curr = ifs;
while (curr != NULL) {
- if (strcmp(name_utf, curr->name) == 0) {
+ if (strcmp(searchName, curr->name) == 0) {
break;
}
curr = curr->next;
}
+ // search the child list
+ if (colonP != NULL && curr != NULL) {
+ curr = curr->childs;
+ while (curr != NULL) {
+ if (strcmp(name_utf, curr->name) == 0) {
+ break;
+ }
+ curr = curr->next;
+ }
+ }
+
// if found create a NetworkInterface
if (curr != NULL) {
obj = createNetworkInterface(env, curr);
--- a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Wed Jul 05 22:38:24 2017 +0200
@@ -81,6 +81,12 @@
#include "sun_nio_fs_UnixNativeDispatcher.h"
+#if defined(_AIX)
+ #define DIR DIR64
+ #define opendir opendir64
+ #define closedir closedir64
+#endif
+
/**
* Size of password or group entry when not available via sysconf
*/
@@ -264,7 +270,11 @@
my_unlinkat_func = (unlinkat_func*) dlsym(RTLD_DEFAULT, "unlinkat");
my_renameat_func = (renameat_func*) dlsym(RTLD_DEFAULT, "renameat");
my_futimesat_func = (futimesat_func*) dlsym(RTLD_DEFAULT, "futimesat");
+#if defined(_AIX)
+ my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir64");
+#else
my_fdopendir_func = (fdopendir_func*) dlsym(RTLD_DEFAULT, "fdopendir");
+#endif
#if defined(FSTATAT64_SYSCALL_AVAILABLE)
/* fstatat64 missing from glibc */
--- a/jdk/src/java.desktop/share/classes/java/beans/PropertyDescriptor.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/java/beans/PropertyDescriptor.java Wed Jul 05 22:38:24 2017 +0200
@@ -183,9 +183,10 @@
setShortDescription(description.toString());
}
Object values = info.get(PropertyInfo.Name.enumerationValues);
- if (values != null) {
- setValue(PropertyInfo.Name.enumerationValues.name(), values);
+ if (values == null) {
+ values = new Object[0];
}
+ setValue(PropertyInfo.Name.enumerationValues.name(), values);
this.baseName = base;
}
--- a/jdk/src/java.desktop/share/classes/javax/swing/JToggleButton.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/JToggleButton.java Wed Jul 05 22:38:24 2017 +0200
@@ -34,6 +34,7 @@
import java.io.ObjectOutputStream;
import java.io.IOException;
+import java.util.Iterator;
/**
* An implementation of a two-state button.
@@ -208,6 +209,96 @@
return true;
}
+ private JToggleButton getGroupSelection(FocusEvent.Cause cause) {
+ switch (cause) {
+ case ACTIVATION:
+ case TRAVERSAL:
+ case TRAVERSAL_UP:
+ case TRAVERSAL_DOWN:
+ case TRAVERSAL_FORWARD:
+ case TRAVERSAL_BACKWARD:
+ ButtonModel model = getModel();
+ JToggleButton selection = this;
+ if (model instanceof DefaultButtonModel) {
+ ButtonGroup group = ((DefaultButtonModel) model).getGroup();
+ if (group != null && group.getSelection() != null
+ && !group.isSelected(model)) {
+ Iterator<AbstractButton> iterator =
+ group.getElements().asIterator();
+ while (iterator.hasNext()) {
+ AbstractButton member = iterator.next();
+ if (group.isSelected(member.getModel())) {
+ if (member instanceof JToggleButton &&
+ member.isVisible() && member.isDisplayable() &&
+ member.isEnabled() && member.isFocusable()) {
+ selection = (JToggleButton) member;
+ }
+ break;
+ }
+ }
+ }
+ }
+ return selection;
+ default:
+ return this;
+ }
+ }
+
+ /**
+ * If this toggle button is a member of the {@link ButtonGroup} which has
+ * another toggle button which is selected and can be the focus owner,
+ * and the focus cause argument denotes window activation or focus
+ * traversal action of any direction the result of the method execution
+ * is the same as calling
+ * {@link Component#requestFocus(FocusEvent.Cause)} on the toggle button
+ * selected in the group.
+ * In all other cases the result of the method is the same as calling
+ * {@link Component#requestFocus(FocusEvent.Cause)} on this toggle button.
+ *
+ * @param cause the cause why the focus is requested
+ * @see ButtonGroup
+ * @see Component#requestFocus(FocusEvent.Cause)
+ * @see FocusEvent.Cause
+ *
+ * @since 9
+ */
+ @Override
+ public void requestFocus(FocusEvent.Cause cause) {
+ getGroupSelection(cause).requestFocusUnconditionally(cause);
+ }
+
+ private void requestFocusUnconditionally(FocusEvent.Cause cause) {
+ super.requestFocus(cause);
+ }
+
+ /**
+ * If this toggle button is a member of the {@link ButtonGroup} which has
+ * another toggle button which is selected and can be the focus owner,
+ * and the focus cause argument denotes window activation or focus
+ * traversal action of any direction the result of the method execution
+ * is the same as calling
+ * {@link Component#requestFocusInWindow(FocusEvent.Cause)} on the toggle
+ * button selected in the group.
+ * In all other cases the result of the method is the same as calling
+ * {@link Component#requestFocusInWindow(FocusEvent.Cause)} on this toggle
+ * button.
+ *
+ * @param cause the cause why the focus is requested
+ * @see ButtonGroup
+ * @see Component#requestFocusInWindow(FocusEvent.Cause)
+ * @see FocusEvent.Cause
+ *
+ * @since 9
+ */
+ public boolean requestFocusInWindow(FocusEvent.Cause cause) {
+ return getGroupSelection(cause)
+ .requestFocusInWindowUnconditionally(cause);
+ }
+
+ private boolean requestFocusInWindowUnconditionally(FocusEvent.Cause cause) {
+ return super.requestFocusInWindow(cause);
+ }
+
// *********************************************************************
/**
--- a/jdk/src/java.desktop/share/classes/javax/swing/UIManager.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/javax/swing/UIManager.java Wed Jul 05 22:38:24 2017 +0200
@@ -629,16 +629,7 @@
}
else {
Class<?> lnfClass = SwingUtilities.loadSystemClass(className);
- try {
- LookAndFeel laf =
- (LookAndFeel)lnfClass.newInstance();
- setLookAndFeel(laf);
- } catch (ReflectiveOperationException | IllegalArgumentException e) {
- InstantiationException ex =
- new InstantiationException("Wrapped Exception");
- ex.initCause(e);
- throw ex;
- }
+ setLookAndFeel((LookAndFeel)(lnfClass.newInstance()));
}
}
--- a/jdk/src/java.desktop/share/classes/sun/awt/FontConfiguration.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/classes/sun/awt/FontConfiguration.java Wed Jul 05 22:38:24 2017 +0200
@@ -182,11 +182,17 @@
throw new Error("java.home property not set");
}
javaLib = javaHome + File.separator + "lib";
+ String javaConfFonts = javaHome +
+ File.separator + "conf" +
+ File.separator + "fonts";
String userConfigFile = System.getProperty("sun.awt.fontconfig");
if (userConfigFile != null) {
fontConfigFile = new File(userConfigFile);
} else {
- fontConfigFile = findFontConfigFile(javaLib);
+ fontConfigFile = findFontConfigFile(javaConfFonts);
+ if (fontConfigFile == null) {
+ fontConfigFile = findFontConfigFile(javaLib);
+ }
}
}
@@ -275,8 +281,11 @@
return null;
}
- private File findFontConfigFile(String javaLib) {
- String baseName = javaLib + File.separator + "fontconfig";
+ private File findFontConfigFile(String dir) {
+ if (!(new File(dir)).exists()) {
+ return null;
+ }
+ String baseName = dir + File.separator + "fontconfig";
File configFile;
String osMajorVersion = null;
if (osVersion != null && osName != null) {
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguageTags.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ScriptAndLanguageTags.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -33,13 +33,14 @@
* Generated on: 10/26/2010 02:53:33 PM PDT
*/
+#include "LEScripts.h"
#include "LETypes.h"
#include "ScriptAndLanguageTags.h"
#include "OpenTypeLayoutEngine.h"
U_NAMESPACE_BEGIN
-const LETag OpenTypeLayoutEngine::scriptTags[] = {
+const LETag OpenTypeLayoutEngine::scriptTags[scriptCodeCount] = {
zyyyScriptTag, /* 'zyyy' (COMMON) */
zinhScriptTag, /* 'zinh' (INHERITED) */
arabScriptTag, /* 'arab' (ARABIC) */
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -302,7 +302,7 @@
le_uint8 charClass;
// Decompose SARA AM into NIKHAHIT + SARA AA
- if (ch == CH_SARA_AM && isLegalHere(ch, state)) {
+ if (ch == CH_SARA_AM && isLegalHere(ch, state) && conState < stateCount) {
outputIndex = conOutput;
state = getNextState(CH_NIKHAHIT, conState, inputIndex, glyphSet, errorChar, charClass,
output, glyphStorage, outputIndex);
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.h Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiShaping.h Wed Jul 05 22:38:24 2017 +0200
@@ -80,7 +80,8 @@
tG = 5,
tH = 6,
tR = 7,
- tS = 8
+ tS = 8,
+ stateCount = 52
};
struct StateTransition
@@ -100,7 +101,7 @@
ThaiShaping();
static const le_uint8 classTable[];
- static const StateTransition thaiStateTable[][classCount];
+ static const StateTransition thaiStateTable[stateCount][classCount];
inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass);
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiStateTables.cpp Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ThaiStateTables.cpp Wed Jul 05 22:38:24 2017 +0200
@@ -49,7 +49,7 @@
/*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON
};
-const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[][ThaiShaping::classCount] = {
+const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[ThaiShaping::stateCount][ThaiShaping::classCount] = {
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| N C C C L F F F B B B T A A A N A A A |
//| O O O O V V V V V V D O D D D I V V V |
--- a/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_BsdOS_ALSA_Ports.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_BsdOS_ALSA_Ports.c Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -385,6 +385,7 @@
int isStereo;
char* type;
snd_mixer_selem_channel_id_t channel;
+ memset(controls, 0, sizeof(controls));
TRACE0("> PORT_GetControls\n");
if (id == NULL) {
--- a/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_LinuxOS_ALSA_Ports.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_LinuxOS_ALSA_Ports.c Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -385,6 +385,7 @@
int isStereo;
char* type;
snd_mixer_selem_channel_id_t channel;
+ memset(controls, 0, sizeof(controls));
TRACE0("> PORT_GetControls\n");
if (id == NULL) {
--- a/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_SolarisOS_Ports.c Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/java.desktop/unix/native/libjsound/PLATFORM_API_SolarisOS_Ports.c Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -390,6 +390,7 @@
int controlCount = 0;
INT32 type;
int selectable = 1;
+ memset(controls, 0, sizeof(controls));
TRACE4(">PORT_GetControls(id=%p, portIndex=%d). controlIDs=%p, maxControlCount=%d\n",
id, portIndex, info->controlIDs, info->maxControlCount);
--- a/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeCipherWithJavaPadding.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/jdk.crypto.ucrypto/solaris/classes/com/oracle/security/ucrypto/NativeCipherWithJavaPadding.java Wed Jul 05 22:38:24 2017 +0200
@@ -28,6 +28,7 @@
import java.nio.ByteBuffer;
import java.util.Set;
import java.util.Arrays;
+import java.util.Locale;
import java.util.concurrent.ConcurrentSkipListSet;
import java.lang.ref.*;
@@ -262,7 +263,7 @@
throws NoSuchAlgorithmException, NoSuchPaddingException {
this.nc = nc;
this.blockSize = nc.engineGetBlockSize();
- if (paddingScheme.toUpperCase().equals("PKCS5PADDING")) {
+ if (paddingScheme.toUpperCase(Locale.ROOT).equals("PKCS5PADDING")) {
padding = new PKCS5Padding(blockSize);
} else {
throw new NoSuchAlgorithmException("Unsupported padding scheme: " + paddingScheme);
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java Wed Jul 05 22:38:24 2017 +0200
@@ -74,6 +74,7 @@
import java.util.Optional;
import java.util.ResourceBundle;
import java.util.Set;
+import java.util.TreeSet;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
@@ -497,6 +498,7 @@
// Add (or replace) the Packages attribute
if (packages != null) {
+ validatePackages(descriptor, packages);
extender.packages(packages);
}
@@ -530,6 +532,24 @@
}
}
+ private void validatePackages(ModuleDescriptor descriptor, Set<String> packages) {
+ Set<String> nonExistPackages = new TreeSet<>();
+ descriptor.exports().stream()
+ .map(Exports::source)
+ .filter(pn -> !packages.contains(pn))
+ .forEach(nonExistPackages::add);
+
+ descriptor.opens().stream()
+ .map(Opens::source)
+ .filter(pn -> !packages.contains(pn))
+ .forEach(nonExistPackages::add);
+
+ if (!nonExistPackages.isEmpty()) {
+ throw new CommandException("err.missing.export.or.open.packages",
+ descriptor.name(), nonExistPackages);
+ }
+ }
+
/*
* Hasher resolves a module graph using the --hash-modules PATTERN
* as the roots.
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/resources/jmod.properties Wed Jul 05 22:38:24 2017 +0200
@@ -107,6 +107,7 @@
err.internal.error=internal error: {0} {1} {2}
err.invalid.dryrun.option=--dry-run can only be used with hash mode
err.module.descriptor.not.found=Module descriptor not found
+err.missing.export.or.open.packages=Packages that are exported or open in {0} are not present: {1}
warn.invalid.arg=Invalid classname or pathname not exist: {0}
warn.no.module.hashes=No hashes recorded: no module specified for hashing depends on {0}
warn.module.resolution.fail=No hashes recorded: {0}
--- a/jdk/test/ProblemList.txt Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/ProblemList.txt Wed Jul 05 22:38:24 2017 +0200
@@ -203,8 +203,6 @@
sun/rmi/rmic/newrmic/equivalence/run.sh 8145980 generic-all
-java/rmi/transport/dgcDeadLock/DGCDeadLock.java 8029360 macosx-all
-
java/rmi/registry/readTest/readTest.sh 7146543 generic-all
############################################################################
@@ -217,10 +215,6 @@
sun/security/tools/jarsigner/warnings/BadKeyUsageTest.java 8026393 generic-all
-sun/security/ssl/SSLSocketImpl/AsyncSSLSocketClose.java 8161232 macosx-all
-
-sun/net/www/protocol/https/HttpsClient/ServerIdentityTest.java 8171043 windows-all
-
javax/net/ssl/DTLS/PacketLossRetransmission.java 8169086 macosx-x64
############################################################################
@@ -234,8 +228,6 @@
javax/sound/sampled/Mixers/DisabledAssertionCrash.java 7067310 generic-all
-javax/sound/sampled/Clip/OpenNonIntegralNumberOfSampleframes.java 8168881 generic-all
-
############################################################################
# jdk_imageio
--- a/jdk/test/java/awt/EmbeddedFrame/DisplayChangedTest/DisplayChangedTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/awt/EmbeddedFrame/DisplayChangedTest/DisplayChangedTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,12 +23,12 @@
/*
@test
- @bug 4980592
+ @bug 4980592 8171363
@summary switching user in XP causes an NPE in
sun.awt.windows.WWindowPeer.displayChanged
@requires (os.family == "windows")
@modules java.desktop/java.awt.peer
- @modules java.desktop/sun.awt.windows
+ @modules java.desktop/sun.awt.windows:open
@modules java.desktop/sun.awt
@author son@sparc.spb.su: area=embedded
@run main DisplayChangedTest
--- a/jdk/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/awt/EmbeddedFrame/EmbeddedFrameGrabTest/EmbeddedFrameGrabTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,12 +23,12 @@
/*
@test
- @bug 6345002
+ @bug 6345003 8171363
@summary grab problems with EmbeddedFrame
@requires (os.family == "windows")
@modules java.desktop/java.awt.peer
@modules java.desktop/sun.awt
- @modules java.desktop/sun.awt.windows
+ @modules java.desktop/sun.awt.windows:open
@author Oleg.Semenov@sun.com area=EmbeddedFrame
@run main EmbeddedFrameGrabTest
*/
--- a/jdk/test/java/awt/datatransfer/ConstructFlavoredObjectTest/ConstructFlavoredObjectTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/awt/datatransfer/ConstructFlavoredObjectTest/ConstructFlavoredObjectTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 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
@@ -31,34 +31,57 @@
/*
* @test
* @key headful
- * @bug 8130329
+ * @bug 8130329 8134612 8133719
* @summary Audit Core Reflection in module java.desktop AWT/Miscellaneous area
* for places that will require changes to work with modules
* @author Alexander Scherbatiy
+ * @run main/othervm ConstructFlavoredObjectTest COPY
+ * @run main/othervm ConstructFlavoredObjectTest PASTE
*/
public class ConstructFlavoredObjectTest {
- private static final String TEST_MIME_TYPE = "text/plain;class="
- + MyStringReader.class.getName();
-
public static void main(String[] args) throws Exception {
- final DataFlavor dataFlavor = new DataFlavor(TEST_MIME_TYPE);
- SystemFlavorMap systemFlavorMap = (SystemFlavorMap) SystemFlavorMap.
- getDefaultFlavorMap();
- systemFlavorMap.addUnencodedNativeForFlavor(dataFlavor, "TEXT");
- systemFlavorMap.addFlavorForUnencodedNative("TEXT", dataFlavor);
+ if (args[0].equals("COPY")) {
+
+ // Copy a simple text string on to the System clipboard
+
+ final String TEXT_MIME_TYPE = DataFlavor.javaJVMLocalObjectMimeType +
+ ";class=" + String.class.getName();
- TransferHandler transferHandler = new TransferHandler("Test Handler");
+ final DataFlavor dataFlavor = new DataFlavor(TEXT_MIME_TYPE);
+ SystemFlavorMap systemFlavorMap =
+ (SystemFlavorMap) SystemFlavorMap.getDefaultFlavorMap();
+ systemFlavorMap.addUnencodedNativeForFlavor(dataFlavor, "TEXT");
+ systemFlavorMap.addFlavorForUnencodedNative("TEXT", dataFlavor);
+
+ TransferHandler transferHandler = new TransferHandler("text");
- Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
- transferHandler.exportToClipboard(new JLabel("Test"), clipboard,
- TransferHandler.COPY);
+ String text = "This is sample export text";
+ Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+ transferHandler.exportToClipboard(new JLabel(text), clipboard,
+ TransferHandler.COPY);
+ }
+ else if (args[0].equals("PASTE")) {
+
+ // Try to read text data from the System clipboard
+
+ final String TEST_MIME_TYPE = "text/plain;class=" +
+ MyStringReader.class.getName();
- Object clipboardData = clipboard.getData(dataFlavor);
+ final DataFlavor dataFlavor = new DataFlavor(TEST_MIME_TYPE);
+ SystemFlavorMap systemFlavorMap = (SystemFlavorMap) SystemFlavorMap.
+ getDefaultFlavorMap();
+ systemFlavorMap.addUnencodedNativeForFlavor(dataFlavor, "TEXT");
+ systemFlavorMap.addFlavorForUnencodedNative("TEXT", dataFlavor);
- if (!(clipboardData instanceof MyStringReader)) {
- throw new RuntimeException("Wrong clipboard data!");
+ Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
+
+ Object clipboardData = clipboard.getData(dataFlavor);
+
+ if (!(clipboardData instanceof MyStringReader)) {
+ throw new RuntimeException("Wrong clipboard data!");
+ }
}
}
@@ -78,3 +101,4 @@
}
}
}
+
--- a/jdk/test/java/beans/Introspector/8130937/TestBooleanBeanProperties.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/beans/Introspector/8130937/TestBooleanBeanProperties.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -28,7 +28,7 @@
/**
* @test
- * @bug 8130937
+ * @bug 8130937 8131347
* @summary Tests the booleans properties of the BeanProperty annotation
* @library ..
*/
@@ -76,6 +76,9 @@
if (getValue(pd, "visualUpdate") != isVS) {
throw new RuntimeException("required should be: " + isVS);
}
+ if (pd.getValue("enumerationValues") == null) {
+ throw new RuntimeException("enumerationValues should be empty array");
+ }
}
private static boolean getValue(PropertyDescriptor pd, String value) {
@@ -107,7 +110,8 @@
}
@BeanProperty(bound = true, expert = true, hidden = true,
- preferred = true, required = true, visualUpdate = true)
+ preferred = true, required = true, visualUpdate = true,
+ enumerationValues = {})
public void setValue(int value) {
this.value = value;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/NetworkInterface/SubNetworkInterfaceTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8168840
+ * @summary InetAddress.getByName() throws java.net.UnknownHostException no such
+ * interface when used with virtual interfaces on Solaris
+ */
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Collections;
+import java.util.Enumeration;
+
+public class SubNetworkInterfaceTest {
+
+ public static void main(String args[]) throws SocketException, UnknownHostException {
+ Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
+ for (NetworkInterface netIf : Collections.list(nets)) {
+ doReverseLookup(netIf);
+ }
+ }
+
+ static void doReverseLookup(NetworkInterface netIf) throws SocketException, UnknownHostException {
+ for (NetworkInterface subIf : Collections.list(netIf.getSubInterfaces())) {
+ Enumeration<InetAddress> subInetAddresses = subIf.getInetAddresses();
+ while (subInetAddresses != null && subInetAddresses.hasMoreElements()) {
+ InetAddress inetAddress = subInetAddresses.nextElement();
+ String reversalString = inetAddress.getHostAddress();
+ //should not throw UHE in case of virtual sub interface
+ InetAddress.getByName(reversalString);
+ }
+ }
+ }
+}
--- a/jdk/test/java/rmi/testlibrary/REGISTRY.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/rmi/testlibrary/REGISTRY.java Wed Jul 05 22:38:24 2017 +0200
@@ -33,28 +33,48 @@
*/
public class REGISTRY extends JavaVM {
- private static double startTimeout = 20_000 * TestLibrary.getTimeoutFactor();
+ private static final double START_TIMEOUT =
+ 20_000 * TestLibrary.getTimeoutFactor();
+ private static final String DEFAULT_RUNNER = "RegistryRunner";
private int port = -1;
- private REGISTRY(OutputStream out, OutputStream err,
+ private REGISTRY(String runner, OutputStream out, OutputStream err,
String options, int port) {
- super("RegistryRunner", options, Integer.toString(port), out, err);
+ super(runner, options, Integer.toString(port), out, err);
+ try {
+ Class runnerClass = Class.forName(runner);
+ if (!RegistryRunner.class.isAssignableFrom(runnerClass)) {
+ throw new RuntimeException("runner class must be RegistryRunner"
+ + " or its sub class");
+ }
+ } catch (ClassNotFoundException ex) {
+ throw new RuntimeException(ex);
+ }
this.port = port;
}
public static REGISTRY createREGISTRY() {
- return createREGISTRY(System.out, System.err, "", 0);
+ return createREGISTRYWithRunner(DEFAULT_RUNNER, System.out, System.err, "", 0);
}
public static REGISTRY createREGISTRY(OutputStream out, OutputStream err,
String options, int port) {
+ return createREGISTRYWithRunner(DEFAULT_RUNNER, out, err, options, port);
+ }
+
+ public static REGISTRY createREGISTRYWithRunner(String runner, String options) {
+ return createREGISTRYWithRunner(runner, System.out, System.err, options, 0);
+ }
+
+ public static REGISTRY createREGISTRYWithRunner(String runner, OutputStream out,
+ OutputStream err, String options, int port) {
options += " --add-exports=java.rmi/sun.rmi.registry=ALL-UNNAMED"
- + " --add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED"
- + " --add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED"
- + " --add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED";
- REGISTRY reg = new REGISTRY(out, err, options, port);
- return reg;
+ + " --add-exports=java.rmi/sun.rmi.server=ALL-UNNAMED"
+ + " --add-exports=java.rmi/sun.rmi.transport=ALL-UNNAMED"
+ + " --add-exports=java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED";
+ REGISTRY reg = new REGISTRY(runner, out, err, options, port);
+ return reg;
}
/**
@@ -65,7 +85,7 @@
public void start() throws IOException {
super.start();
long startTime = System.currentTimeMillis();
- long deadline = TestLibrary.computeDeadline(startTime, (long)startTimeout);
+ long deadline = TestLibrary.computeDeadline(startTime, (long)START_TIMEOUT);
while (true) {
try {
Thread.sleep(1000);
--- a/jdk/test/java/rmi/testlibrary/RegistryRunner.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/rmi/testlibrary/RegistryRunner.java Wed Jul 05 22:38:24 2017 +0200
@@ -36,7 +36,7 @@
implements RemoteExiter
{
private static final String PORT_LABEL_START = "RegistryRunner.port.start:";
- private static final String PORT_LABEL_END = "RegistryRunner.port.end";
+ private static final String PORT_LABEL_END = ":RegistryRunner.port.end";
private static Registry registry = null;
private static RemoteExiter exiter = null;
@@ -95,17 +95,17 @@
return port;
}
- public static void main(String[] args) {
-
+ /**
+ * port 0 means to use ephemeral port to start registry.
+ */
+ protected static int init(String[] args) {
try {
if (args.length == 0) {
System.err.println("Usage: <port>");
System.exit(0);
}
int port = -1;
- try {
- port = Integer.parseInt(args[0]);
- } catch (NumberFormatException ignore) { }
+ port = Integer.parseInt(args[0]);
// create a registry
registry = LocateRegistry.createRegistry(port);
@@ -118,14 +118,30 @@
Naming.rebind("rmi://localhost:" + port +
"/RemoteExiter", exiter);
- // this output is important for REGISTRY to get the port
- // where rmiregistry is serving
- System.out.println(PORT_LABEL_START + port + PORT_LABEL_END);
-
+ return port;
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
System.exit(-1);
}
+ return -1;
+ }
+
+ /**
+ * REGISTRY.start() will filter the output of registry subprocess,
+ * when valid port is detected, REGISTRY.start() returns.
+ * So, for subclass, it's important to call this method after registry
+ * is initialized and necessary remote objects have been bound.
+ */
+ protected static void notify(int port) {
+ // this output is important for REGISTRY to get the port
+ // where rmiregistry is serving
+ System.out.println(PORT_LABEL_START + port + PORT_LABEL_END);
+ System.out.flush();
+ }
+
+ public static void main(String[] args) {
+ int port = init(args);
+ notify(port);
}
}
--- a/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/DGCDeadLock.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -33,7 +33,7 @@
* java.rmi/sun.rmi.server
* java.rmi/sun.rmi.transport
* java.rmi/sun.rmi.transport.tcp
- * @build TestLibrary Test TestImpl TestImpl_Stub
+ * @build TestLibrary Test TestImpl REGISTRY RegistryRunner
* @run main/othervm/policy=security.policy/timeout=360 DGCDeadLock
*/
@@ -55,11 +55,12 @@
import java.io.*;
public class DGCDeadLock implements Runnable {
- private static final int REGISTRY_PORT = TestLibrary.getUnusedRandomPort();
final static public int HOLD_TARGET_TIME = 25000;
- public static int TEST_FAIL_TIME = HOLD_TARGET_TIME + 30000;
- public static boolean finished = false;
- static DGCDeadLock test = new DGCDeadLock();
+ public static final double TEST_FAIL_TIME =
+ (HOLD_TARGET_TIME + 30000) * TestLibrary.getTimeoutFactor();
+ public static volatile boolean finished = false;
+ static final DGCDeadLock test = new DGCDeadLock();
+ static volatile int registryPort = -1;
static {
System.setProperty("sun.rmi.transport.cleanInterval", "50");
@@ -67,7 +68,7 @@
static public void main(String[] args) {
- JavaVM testImplVM = null;
+ REGISTRY testImplVM = null;
System.err.println("\nregression test for 4118056\n");
TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
@@ -75,18 +76,15 @@
try {
String options = " -Djava.security.policy=" +
TestParams.defaultPolicy +
- " --add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED" +
- " --add-exports java.rmi/sun.rmi.server=ALL-UNNAMED" +
" --add-opens java.rmi/sun.rmi.transport=ALL-UNNAMED" +
- " --add-exports java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED" +
" -Djava.rmi.dgc.leaseValue=500000" +
- " -Dsun.rmi.dgc.checkInterval=" +
+ " -Dsun.rmi.dgc.checkInterval=" +
(HOLD_TARGET_TIME - 5000) +
- " -Drmi.registry.port=" + REGISTRY_PORT +
"" ;
- testImplVM = new JavaVM("TestImpl", options, "");
+ testImplVM = REGISTRY.createREGISTRYWithRunner("TestImpl", options);
testImplVM.start();
+ registryPort = testImplVM.getPort();
synchronized (test) {
Thread t = new Thread(test);
@@ -94,7 +92,7 @@
t.start();
// wait for the remote calls to take place
- test.wait(TEST_FAIL_TIME);
+ test.wait((long)TEST_FAIL_TIME);
}
if (!finished) {
@@ -106,8 +104,12 @@
"finished in time.");
} catch (Exception e) {
- testImplVM = null;
- TestLibrary.bomb("test failed", e);
+ TestLibrary.bomb("test failed in main()", e);
+ } finally {
+ if (testImplVM != null) {
+ testImplVM.shutdown();
+ testImplVM = null;
+ }
}
}
@@ -115,12 +117,9 @@
try {
String echo = null;
- // give the test remote object time to initialize.
- Thread.currentThread().sleep(8000);
-
// create a test client
Test foo = (Test) Naming.lookup("rmi://:" +
- REGISTRY_PORT +
+ registryPort +
"/Foo");
echo = foo.echo("Hello world");
System.err.println("Test object created.");
@@ -139,7 +138,7 @@
//import "Bar"
Test bar = (Test) Naming.lookup("rmi://:" +
- REGISTRY_PORT +
+ registryPort +
"/Bar");
/* infinite loop to show the liveness of Client,
@@ -155,11 +154,16 @@
finished = true;
} catch (RemoteException e) {
+ System.err.println("catch RemoteException");
+ e.printStackTrace();
}
} catch (Exception e) {
- TestLibrary.bomb("test failed", e);
+ TestLibrary.bomb("test failed in run()", e);
} finally {
+ synchronized(this) {
+ notify();
+ }
}
}
}
--- a/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/rmi/transport/dgcDeadLock/TestImpl.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -34,7 +34,7 @@
import java.rmi.registry.*;
import java.rmi.server.*;
-public class TestImpl extends UnicastRemoteObject
+public class TestImpl extends RegistryRunner
implements Test {
static Thread locker = null;
static TestImpl foo = null;
@@ -53,12 +53,8 @@
}
static public void main(String[] args) {
- Registry registry = null;
-
try {
- int registryPort = Integer.parseInt(System.getProperty("rmi.registry.port"));
- registry = java.rmi.registry.LocateRegistry.
- createRegistry(registryPort);
+ int registryPort = RegistryRunner.init(args);
//export "Foo"
foo = new TestImpl();
@@ -75,16 +71,11 @@
} catch (Exception e) {
throw new RemoteException(e.getMessage());
}
- Thread.sleep(DGCDeadLock.TEST_FAIL_TIME);
- System.err.println("object vm exiting...");
- System.exit(0);
+ RegistryRunner.notify(registryPort);
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
- } finally {
- TestLibrary.unexport(registry);
- registry = null;
}
}
--- a/jdk/test/java/time/tck/java/time/format/TCKLocalizedFieldParser.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/time/tck/java/time/format/TCKLocalizedFieldParser.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -66,9 +66,11 @@
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
+import java.util.Locale;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -79,12 +81,17 @@
*/
@Test
public class TCKLocalizedFieldParser extends AbstractTestPrinterParser {
-
+ public static final WeekFields WEEKDEF = WeekFields.of(Locale.US);
+ public static final TemporalField WEEK_BASED_YEAR = WEEKDEF.weekBasedYear();
+ public static final TemporalField WEEK_OF_WEEK_BASED_YEAR = WEEKDEF.weekOfWeekBasedYear();
+ public static final TemporalField DAY_OF_WEEK = WEEKDEF.dayOfWeek();
//-----------------------------------------------------------------------
@DataProvider(name="FieldPatterns")
Object[][] provider_fieldPatterns() {
return new Object[][] {
- {"e", "6", 0, 1, 6},
+ {"e", "6", 0, 1, 6},
+ {"ee", "06", 0, 2, 6},
+ {"c", "6", 0, 1 , 6},
{"W", "3", 0, 1, 3},
{"w", "29", 0, 2, 29},
{"ww", "29", 0, 2, 29},
@@ -99,6 +106,7 @@
WeekFields weekDef = WeekFields.of(locale);
TemporalField field = null;
switch(pattern.charAt(0)) {
+ case 'c' :
case 'e' :
field = weekDef.dayOfWeek();
break;
@@ -176,9 +184,9 @@
{"Y-w-e", "2008-01-1", 0, 9, LocalDate.of(2007, 12, 30)},
{"Y-w-e", "2008-52-1", 0, 9, LocalDate.of(2008, 12, 21)},
{"Y-w-e", "2008-52-7", 0, 9, LocalDate.of(2008, 12, 27)},
- {"Y-w-e", "2009-01-01", 0, 10, LocalDate.of(2008, 12, 28)},
- {"Y-w-e", "2009-01-04", 0, 10, LocalDate.of(2008, 12, 31)},
- {"Y-w-e", "2009-01-05", 0, 10, LocalDate.of(2009, 1, 1)},
+ {"Y-w-e", "2009-01-1", 0, 9, LocalDate.of(2008, 12, 28)},
+ {"Y-w-e", "2009-01-4", 0, 9, LocalDate.of(2008, 12, 31)},
+ {"Y-w-e", "2009-01-5", 0, 9, LocalDate.of(2009, 1, 1)},
};
}
@@ -202,4 +210,77 @@
}
}
+ //-----------------------------------------------------------------------
+ @DataProvider(name = "adjacentValuePatterns1")
+ Object[][] provider_adjacentValuePatterns1() {
+ return new Object[][] {
+ {"YYww", WEEK_BASED_YEAR, WEEK_OF_WEEK_BASED_YEAR, "1612", 2016, 12},
+ {"YYYYww", WEEK_BASED_YEAR, WEEK_OF_WEEK_BASED_YEAR, "201612", 2016, 12},
+ };
+ }
+
+ @Test(dataProvider = "adjacentValuePatterns1")
+ public void test_adjacentValuePatterns1(String pattern, TemporalField field1, TemporalField field2,
+ String text, int expected1, int expected2) {
+ DateTimeFormatter df = new DateTimeFormatterBuilder()
+ .appendPattern(pattern).toFormatter(Locale.US);
+ ParsePosition ppos = new ParsePosition(0);
+ TemporalAccessor parsed = df.parseUnresolved(text, ppos);
+ assertEquals(parsed.get(field1), expected1);
+ assertEquals(parsed.get(field2), expected2);
+ }
+
+ @DataProvider(name = "adjacentValuePatterns2")
+ Object[][] provider_adjacentValuePatterns2() {
+ return new Object[][] {
+ {"YYYYwwc", WEEK_BASED_YEAR, WEEK_OF_WEEK_BASED_YEAR, DAY_OF_WEEK,
+ "2016121", 2016, 12, 1},
+ {"YYYYwwee", WEEK_BASED_YEAR, WEEK_OF_WEEK_BASED_YEAR, DAY_OF_WEEK,
+ "20161201", 2016, 12, 1},
+ {"YYYYwwe", WEEK_BASED_YEAR, WEEK_OF_WEEK_BASED_YEAR, DAY_OF_WEEK,
+ "2016121", 2016, 12, 1},
+ };
+ }
+
+ @Test(dataProvider = "adjacentValuePatterns2")
+ public void test_adjacentValuePatterns2(String pattern, TemporalField field1, TemporalField field2,
+ TemporalField field3, String text, int expected1, int expected2, int expected3) {
+ DateTimeFormatter df = new DateTimeFormatterBuilder()
+ .appendPattern(pattern).toFormatter(Locale.US);
+ ParsePosition ppos = new ParsePosition(0);
+ TemporalAccessor parsed = df.parseUnresolved(text, ppos);
+ assertEquals(parsed.get(field1), expected1);
+ assertEquals(parsed.get(field2), expected2);
+ assertEquals(parsed.get(field3), expected3);
+ }
+
+ @Test
+ public void test_adjacentValuePatterns3() {
+ String pattern = "yyyyMMddwwc";
+ String text = "20120720296";
+ DateTimeFormatter df = new DateTimeFormatterBuilder()
+ .appendPattern(pattern).toFormatter(Locale.US);
+ ParsePosition ppos = new ParsePosition(0);
+ TemporalAccessor parsed = df.parseUnresolved(text, ppos);
+ assertEquals(parsed.get(DAY_OF_WEEK), 6);
+ assertEquals(parsed.get(WEEK_OF_WEEK_BASED_YEAR), 29);
+ LocalDate result = LocalDate.parse(text, df);
+ LocalDate expectedValue = LocalDate.of(2012, 07, 20);
+ assertEquals(result, expectedValue, "LocalDate incorrect for " + pattern);
+ }
+
+ @DataProvider(name = "invalidPatterns")
+ Object[][] provider_invalidPatterns() {
+ return new Object[][] {
+ {"W", "01"},
+ {"c", "01"},
+ {"e", "01"},
+ {"yyyyMMddwwc", "201207202906"}, // 1 extra digit in the input
+ };
+ }
+
+ @Test(dataProvider = "invalidPatterns", expectedExceptions = DateTimeParseException.class)
+ public void test_invalidPatterns(String pattern, String value) {
+ DateTimeFormatter.ofPattern(pattern).parse(value);
+ }
}
--- a/jdk/test/java/util/Currency/CurrencyTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/Currency/CurrencyTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,7 +23,7 @@
/*
* @test
* @bug 4290801 4692419 4693631 5101540 5104960 6296410 6336600 6371531
- * 6488442 7036905 8008577 8039317 8074350 8074351 8150324
+ * 6488442 7036905 8008577 8039317 8074350 8074351 8150324 8167143
* @summary Basic tests for Currency class.
* @modules java.base/java.util:open
* jdk.localedata
@@ -188,7 +188,7 @@
static void testSymbols() {
testSymbol("USD", Locale.US, "$");
testSymbol("EUR", Locale.GERMANY, "\u20AC");
- testSymbol("USD", Locale.PRC, "USD");
+ testSymbol("USD", Locale.PRC, "US$");
}
static void testSymbol(String currencyCode, Locale locale, String expectedSymbol) {
@@ -262,7 +262,7 @@
testDisplayName("KRW", Locale.KOREAN, "\ub300\ud55c\ubbfc\uad6d \uc6d0");
testDisplayName("SEK", new Locale("sv"), "svensk krona");
testDisplayName("CNY", Locale.SIMPLIFIED_CHINESE, "\u4eba\u6c11\u5e01");
- testDisplayName("TWD", Locale.TRADITIONAL_CHINESE, "\u65b0\u81fa\u5e63");
+ testDisplayName("TWD", Locale.TRADITIONAL_CHINESE, "\u65b0\u53f0\u5e63");
}
static void testDisplayName(String currencyCode, Locale locale, String expectedName) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/TimeZone/Bug8167143.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,279 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8167143
+ * @summary Test
+ * Timezone parsing works for all locales for default providers prefernce
+ * as well as when prefernce list is [COMPAT, CLDR],
+ * CLDR implict locales are correctly reflected,
+ * th_TH bundle is not wrongly cached in DateFormatSymbols,
+ * correct candidate locale list is retrieved for
+ * zh_Hant and zh_Hans and
+ * Implict COMPAT Locales nn-NO, nb-NO are reflected in available locales
+ * for all Providers for COMPAT.
+ * @modules java.base/sun.util.locale.provider
+ * java.base/sun.util.spi
+ * jdk.localedata
+ * @run main/othervm -Djava.locale.providers=COMPAT,CLDR Bug8167143 testTimeZone
+ * @run main/othervm Bug8167143 testTimeZone
+ * @run main/othervm -Djava.locale.providers=CLDR Bug8167143 testCldr
+ * @run main/othervm Bug8167143 testCache
+ * @run main/othervm Bug8167143 testCandidateLocales
+ * @run main/othervm -Djava.locale.providers=COMPAT Bug8167143 testCompat
+ */
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.TimeZone;
+
+import sun.util.locale.provider.LocaleProviderAdapter;
+import sun.util.locale.provider.LocaleProviderAdapter.Type;
+
+public class Bug8167143 {
+
+ private static final TimeZone REYKJAVIK = TimeZone.getTimeZone("Atlantic/Reykjavik");
+ private static final TimeZone NEW_YORK = TimeZone.getTimeZone("America/New_York");
+ private static final TimeZone GMT = TimeZone.getTimeZone("GMT");
+
+ private static final List<Locale> CLDR_IMPLICIT_LOCS = List.of(Locale.forLanguageTag("zh-Hans-CN"),
+ Locale.forLanguageTag("zh-Hans-SG"),
+ Locale.forLanguageTag("zh-Hant-HK"),
+ Locale.forLanguageTag("zh-Hant-TW"),
+ Locale.forLanguageTag("zh-Hant-MO"));
+
+ private static final List<Locale> COMPAT_IMPLICIT_LOCS = List.of(Locale.forLanguageTag("nn-NO"),
+ Locale.forLanguageTag("nb-NO"));
+ /**
+ * List of candidate locales for zh_Hant
+ */
+ private static final List<Locale> ZH_HANT_CANDLOCS = List.of(
+ Locale.forLanguageTag("zh-Hant"),
+ Locale.forLanguageTag("zh-TW"),
+ Locale.forLanguageTag("zh"),
+ Locale.ROOT);
+ /**
+ * List of candidate locales for zh_Hans
+ */
+ private static final List<Locale> ZH_HANS_CANDLOCS = List.of(
+ Locale.forLanguageTag("zh-Hans"),
+ Locale.forLanguageTag("zh-CN"),
+ Locale.forLanguageTag("zh"),
+ Locale.ROOT);
+
+ public static void main(String[] args) {
+ switch (args[0]) {
+ case "testTimeZone":
+ testTimeZoneParsing();
+ break;
+ case "testCldr":
+ testImplicitCldrLocales();
+ break;
+ case "testCache":
+ testDateFormatSymbolsCache();
+ break;
+ case "testCandidateLocales":
+ testCandidateLocales();
+ break;
+ case "testCompat":
+ testImplicitCompatLocales();
+ break;
+ default:
+ throw new RuntimeException("no test was specified.");
+ }
+ }
+
+ /**
+ * Check that if Locale Provider Preference list is Default, or if Locale
+ * Provider Preference List is COMPAT,CLDR SimplDateFormat parsing works for
+ * all Available Locales.
+ */
+ private static void testTimeZoneParsing() {
+ Set<Locale> locales = Set.of(Locale.forLanguageTag("zh-hant"), new Locale("no", "NO", "NY"));
+ // Set<Locale> locales = Set.of(Locale.getAvailableLocales());
+ locales.forEach((locale) -> {
+ final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd z", locale);
+ for (final TimeZone tz : new TimeZone[]{REYKJAVIK, GMT, NEW_YORK}) {
+ try {
+ sdf.parse("2000/02/10 " + tz.getDisplayName(locale));
+ } catch (ParseException e) {
+ throw new RuntimeException("TimeZone Parsing failed with Locale "
+ + locale + " for TimeZone " + tz.getDisplayName(), e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Check that locales implicitly supported from CLDR are reflected in output
+ * from getAvailbleLocales() for each bundle.
+ *
+ */
+ private static void testImplicitCldrLocales() {
+ LocaleProviderAdapter cldr = LocaleProviderAdapter.forType(Type.CLDR);
+ checkPresenceCldr("CurrencyNameProvider",
+ cldr.getCurrencyNameProvider().getAvailableLocales());
+ checkPresenceCldr("LocaleNameProvider",
+ cldr.getLocaleNameProvider().getAvailableLocales());
+ checkPresenceCldr("TimeZoneNameProvider",
+ cldr.getTimeZoneNameProvider().getAvailableLocales());
+ checkPresenceCldr("CalendarDataProvider",
+ cldr.getCalendarDataProvider().getAvailableLocales());
+ checkPresenceCldr("CalendarNameProvider",
+ cldr.getCalendarProvider().getAvailableLocales());
+ }
+
+ private static void checkPresenceCldr(String testName, Locale[] got) {
+ List<Locale> gotLocalesList = Arrays.asList(got);
+ List<Locale> gotList = new ArrayList<>(gotLocalesList);
+ if (!testName.equals("TimeZoneNameProvider")) {
+ if (!gotList.removeAll(CLDR_IMPLICIT_LOCS)) {
+ // check which locale are not present in retrievedLocales List.
+ List<Locale> expectedLocales = new ArrayList<>(CLDR_IMPLICIT_LOCS);
+ expectedLocales.removeAll(gotList);
+ throw new RuntimeException("Locales those not correctly reflected are "
+ + expectedLocales + " for test " + testName);
+ }
+ } else {
+ // check one extra locale zh_HK for TimeZoneNameProvider
+ Locale zh_HK = Locale.forLanguageTag("zh-HK");
+ if (!gotList.removeAll(CLDR_IMPLICIT_LOCS) && gotList.remove(zh_HK)) {
+ //check which locale are not present in retrievedLocales List
+ List<Locale> expectedLocales = new ArrayList<>(CLDR_IMPLICIT_LOCS);
+ expectedLocales.add(zh_HK);
+ expectedLocales.removeAll(gotList);
+ throw new RuntimeException("Locales those not correctly reflected are "
+ + expectedLocales + " for test " + testName);
+ }
+ }
+ }
+
+ /**
+ * Check that if Locale Provider Preference list is default and if
+ * SimpleDateFormat instance for th-TH-TH is created first, then JRE bundle
+ * for th-TH should not be cached in cache of DateFormatSymbols class.
+ */
+ private static void testDateFormatSymbolsCache() {
+ Locale th_TH_TH = new Locale("th", "TH", "TH");
+ Locale th_TH = new Locale("th", "TH");
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd z", th_TH_TH);
+ String[][] thTHTHZoneStrings = sdf.getDateFormatSymbols().getZoneStrings();
+ String[][] thTHZoneStrings = sdf.getDateFormatSymbols().getZoneStrings();
+ if (Arrays.equals(thTHTHZoneStrings, thTHZoneStrings)) {
+ throw new RuntimeException("th_TH bundle still cached with DateFormatSymbols"
+ + "cache for locale " + th_TH
+ );
+ }
+ }
+
+ /**
+ * Check that candidate locales list retrieved for zh__Hant and for zh__Hans
+ * do not have first candidate locale as zh_TW_Hant and zh_CN_Hans
+ * respectively.
+ */
+ private static void testCandidateLocales() {
+ ResourceBundle.Control Control = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT);
+ Locale zh_Hant = Locale.forLanguageTag("zh-Hant");
+ Locale zh_Hans = Locale.forLanguageTag("zh-Hans");
+ List<Locale> zhHantCandidateLocs = Control.getCandidateLocales("", zh_Hant);
+ List<Locale> zhHansCandidateLocs = Control.getCandidateLocales("", zh_Hans);
+ if (!zhHantCandidateLocs.equals(ZH_HANT_CANDLOCS)) {
+ reportDifference(zhHantCandidateLocs, ZH_HANT_CANDLOCS, "zh_Hant");
+
+ }
+ if (!zhHansCandidateLocs.equals(ZH_HANS_CANDLOCS)) {
+ reportDifference(zhHansCandidateLocs, ZH_HANS_CANDLOCS, "zh_Hans");
+
+ }
+ }
+
+ private static void reportDifference(List<Locale> got, List<Locale> expected, String locale) {
+ List<Locale> retrievedList = new ArrayList<>(got);
+ List<Locale> expectedList = new ArrayList<>(expected);
+ retrievedList.removeAll(expectedList);
+ expectedList.removeAll(retrievedList);
+ if ((retrievedList.size() > 0) && (expectedList.size() > 0)) {
+ throw new RuntimeException(" retrievedList contain extra candidate locales " + retrievedList
+ + " and missing candidate locales " + expectedList
+ + "for locale " + locale);
+ }
+ if ((retrievedList.size() > 0)) {
+ throw new RuntimeException(" retrievedList contain extra candidate locales " + retrievedList
+ + "for locale " + locale);
+ }
+ if ((expectedList.size() > 0)) {
+ throw new RuntimeException(" retrievedList contain extra candidate locales " + expectedList
+ + "for locale " + locale);
+ }
+ }
+
+ /**
+ * checks that locales nn-NO and nb-NO should be present in list of supported locales for
+ * all Providers for COMPAT.
+ */
+ private static void testImplicitCompatLocales() {
+ LocaleProviderAdapter jre = LocaleProviderAdapter.forJRE();
+ checkPresenceCompat("BreakIteratorProvider",
+ jre.getBreakIteratorProvider().getAvailableLocales());
+ checkPresenceCompat("CollatorProvider",
+ jre.getCollatorProvider().getAvailableLocales());
+ checkPresenceCompat("DateFormatProvider",
+ jre.getDateFormatProvider().getAvailableLocales());
+ checkPresenceCompat("DateFormatSymbolsProvider",
+ jre.getDateFormatSymbolsProvider().getAvailableLocales());
+ checkPresenceCompat("DecimalFormatSymbolsProvider",
+ jre.getDecimalFormatSymbolsProvider().getAvailableLocales());
+ checkPresenceCompat("NumberFormatProvider",
+ jre.getNumberFormatProvider().getAvailableLocales());
+ checkPresenceCompat("CurrencyNameProvider",
+ jre.getCurrencyNameProvider().getAvailableLocales());
+ checkPresenceCompat("LocaleNameProvider",
+ jre.getLocaleNameProvider().getAvailableLocales());
+ checkPresenceCompat("TimeZoneNameProvider",
+ jre.getTimeZoneNameProvider().getAvailableLocales());
+ checkPresenceCompat("CalendarDataProvider",
+ jre.getCalendarDataProvider().getAvailableLocales());
+ checkPresenceCompat("CalendarNameProvider",
+ jre.getCalendarNameProvider().getAvailableLocales());
+ checkPresenceCompat("CalendarProvider",
+ jre.getCalendarProvider().getAvailableLocales());
+ }
+
+ private static void checkPresenceCompat(String testName, Locale[] got) {
+ List<Locale> gotLocalesList = Arrays.asList(got);
+ List<Locale> gotList = new ArrayList<>(gotLocalesList);
+ if (!gotList.removeAll(COMPAT_IMPLICIT_LOCS)) {
+ // check which Implicit locale are not present in retrievedLocales List.
+ List<Locale> implicitLocales = new ArrayList<>(COMPAT_IMPLICIT_LOCS);
+ implicitLocales.removeAll(gotList);
+ throw new RuntimeException("Locales those not correctly reflected are "
+ + implicitLocales + " for test " + testName);
+ }
+ }
+}
--- a/jdk/test/java/util/concurrent/tck/Collection8Test.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/Collection8Test.java Wed Jul 05 22:38:24 2017 +0200
@@ -39,6 +39,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.ConcurrentModificationException;
import java.util.Deque;
import java.util.HashSet;
import java.util.Iterator;
@@ -369,9 +370,112 @@
}
/**
+ * All elements removed in the middle of CONCURRENT traversal.
+ */
+ public void testElementRemovalDuringTraversal() {
+ Collection c = impl.emptyCollection();
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ int n = rnd.nextInt(6);
+ ArrayList copy = new ArrayList();
+ for (int i = 0; i < n; i++) {
+ Object x = impl.makeElement(i);
+ copy.add(x);
+ c.add(x);
+ }
+ ArrayList iterated = new ArrayList();
+ ArrayList spliterated = new ArrayList();
+ Spliterator s = c.spliterator();
+ Iterator it = c.iterator();
+ for (int i = rnd.nextInt(n + 1); --i >= 0; ) {
+ assertTrue(s.tryAdvance(spliterated::add));
+ if (rnd.nextBoolean()) assertTrue(it.hasNext());
+ iterated.add(it.next());
+ }
+ Consumer alwaysThrows = e -> { throw new AssertionError(); };
+ if (s.hasCharacteristics(Spliterator.CONCURRENT)) {
+ c.clear(); // TODO: many more removal methods
+ if (testImplementationDetails
+ && !(c instanceof java.util.concurrent.ArrayBlockingQueue)) {
+ if (rnd.nextBoolean())
+ assertFalse(s.tryAdvance(alwaysThrows));
+ else
+ s.forEachRemaining(alwaysThrows);
+ }
+ if (it.hasNext()) iterated.add(it.next());
+ if (rnd.nextBoolean()) assertIteratorExhausted(it);
+ }
+ assertTrue(copy.containsAll(iterated));
+ assertTrue(copy.containsAll(spliterated));
+ }
+
+ /**
+ * Some elements randomly disappear in the middle of traversal.
+ */
+ public void testRandomElementRemovalDuringTraversal() {
+ Collection c = impl.emptyCollection();
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ int n = rnd.nextInt(6);
+ ArrayList copy = new ArrayList();
+ for (int i = 0; i < n; i++) {
+ Object x = impl.makeElement(i);
+ copy.add(x);
+ c.add(x);
+ }
+ ArrayList iterated = new ArrayList();
+ ArrayList spliterated = new ArrayList();
+ ArrayList removed = new ArrayList();
+ Spliterator s = c.spliterator();
+ Iterator it = c.iterator();
+ if (! (s.hasCharacteristics(Spliterator.CONCURRENT) ||
+ s.hasCharacteristics(Spliterator.IMMUTABLE)))
+ return;
+ for (int i = rnd.nextInt(n + 1); --i >= 0; ) {
+ assertTrue(s.tryAdvance(e -> {}));
+ if (rnd.nextBoolean()) assertTrue(it.hasNext());
+ it.next();
+ }
+ Consumer alwaysThrows = e -> { throw new AssertionError(); };
+ // TODO: many more removal methods
+ if (rnd.nextBoolean()) {
+ for (Iterator z = c.iterator(); z.hasNext(); ) {
+ Object e = z.next();
+ if (rnd.nextBoolean()) {
+ try {
+ z.remove();
+ } catch (UnsupportedOperationException ok) { return; }
+ removed.add(e);
+ }
+ }
+ } else {
+ Predicate randomlyRemove = e -> {
+ if (rnd.nextBoolean()) { removed.add(e); return true; }
+ else return false;
+ };
+ c.removeIf(randomlyRemove);
+ }
+ s.forEachRemaining(spliterated::add);
+ while (it.hasNext())
+ iterated.add(it.next());
+ assertTrue(copy.containsAll(iterated));
+ assertTrue(copy.containsAll(spliterated));
+ assertTrue(copy.containsAll(removed));
+ if (s.hasCharacteristics(Spliterator.CONCURRENT)) {
+ ArrayList iteratedAndRemoved = new ArrayList(iterated);
+ ArrayList spliteratedAndRemoved = new ArrayList(spliterated);
+ iteratedAndRemoved.retainAll(removed);
+ spliteratedAndRemoved.retainAll(removed);
+ assertTrue(iteratedAndRemoved.size() <= 1);
+ assertTrue(spliteratedAndRemoved.size() <= 1);
+ if (testImplementationDetails
+ && !(c instanceof java.util.concurrent.ArrayBlockingQueue))
+ assertTrue(spliteratedAndRemoved.isEmpty());
+ }
+ }
+
+ /**
* Various ways of traversing a collection yield same elements
*/
- public void testIteratorEquivalence() {
+ public void testTraversalEquivalence() {
Collection c = impl.emptyCollection();
ThreadLocalRandom rnd = ThreadLocalRandom.current();
int n = rnd.nextInt(6);
@@ -439,6 +543,43 @@
}
/**
+ * Iterator.forEachRemaining has same behavior as Iterator's
+ * default implementation.
+ */
+ public void testForEachRemainingConsistentWithDefaultImplementation() {
+ Collection c = impl.emptyCollection();
+ if (!testImplementationDetails
+ || c.getClass() == java.util.LinkedList.class)
+ return;
+ ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ int n = 1 + rnd.nextInt(3);
+ for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
+ ArrayList iterated = new ArrayList();
+ ArrayList iteratedForEachRemaining = new ArrayList();
+ Iterator it1 = c.iterator();
+ Iterator it2 = c.iterator();
+ assertTrue(it1.hasNext());
+ assertTrue(it2.hasNext());
+ c.clear();
+ Object r1, r2;
+ try {
+ while (it1.hasNext()) iterated.add(it1.next());
+ r1 = iterated;
+ } catch (ConcurrentModificationException ex) {
+ r1 = ConcurrentModificationException.class;
+ assertFalse(impl.isConcurrent());
+ }
+ try {
+ it2.forEachRemaining(iteratedForEachRemaining::add);
+ r2 = iteratedForEachRemaining;
+ } catch (ConcurrentModificationException ex) {
+ r2 = ConcurrentModificationException.class;
+ assertFalse(impl.isConcurrent());
+ }
+ assertEquals(r1, r2);
+ }
+
+ /**
* Calling Iterator#remove() after Iterator#forEachRemaining
* should (maybe) remove last element
*/
@@ -577,6 +718,41 @@
assertTrue(found.isEmpty());
}
+ /** TODO: promote to a common utility */
+ static <T> T chooseOne(T ... ts) {
+ return ts[ThreadLocalRandom.current().nextInt(ts.length)];
+ }
+
+ /** TODO: more random adders and removers */
+ static <E> Runnable adderRemover(Collection<E> c, E e) {
+ return chooseOne(
+ () -> {
+ assertTrue(c.add(e));
+ assertTrue(c.contains(e));
+ assertTrue(c.remove(e));
+ assertFalse(c.contains(e));
+ },
+ () -> {
+ assertTrue(c.add(e));
+ assertTrue(c.contains(e));
+ assertTrue(c.removeIf(x -> x == e));
+ assertFalse(c.contains(e));
+ },
+ () -> {
+ assertTrue(c.add(e));
+ assertTrue(c.contains(e));
+ for (Iterator it = c.iterator();; )
+ if (it.next() == e) {
+ try { it.remove(); }
+ catch (UnsupportedOperationException ok) {
+ c.remove(e);
+ }
+ break;
+ }
+ assertFalse(c.contains(e));
+ });
+ }
+
/**
* Motley crew of threads concurrently randomly hammer the collection.
*/
@@ -616,17 +792,20 @@
() -> checkArraySanity.accept(c.toArray()),
() -> checkArraySanity.accept(c.toArray(emptyArray)),
() -> {
- assertTrue(c.add(one));
- assertTrue(c.contains(one));
- assertTrue(c.remove(one));
- assertFalse(c.contains(one));
- },
- () -> {
- assertTrue(c.add(two));
- assertTrue(c.contains(two));
- assertTrue(c.remove(two));
- assertFalse(c.contains(two));
- },
+ Object[] a = new Object[5];
+ Object three = impl.makeElement(3);
+ Arrays.fill(a, 0, a.length, three);
+ Object[] x = c.toArray(a);
+ if (x == a)
+ for (int i = 0; i < a.length && a[i] != null; i++)
+ checkSanity.accept(a[i]);
+ // A careful reading of the spec does not support:
+ // for (i++; i < a.length; i++) assertSame(three, a[i]);
+ else
+ checkArraySanity.accept(x);
+ },
+ adderRemover(c, one),
+ adderRemover(c, two),
};
final List<Runnable> tasks =
Arrays.stream(frobbers)
@@ -684,6 +863,22 @@
}
}
+ /**
+ * Spliterator.getComparator throws IllegalStateException iff the
+ * spliterator does not report SORTED.
+ */
+ public void testGetComparator_IllegalStateException() {
+ Collection c = impl.emptyCollection();
+ Spliterator s = c.spliterator();
+ boolean reportsSorted = s.hasCharacteristics(Spliterator.SORTED);
+ try {
+ s.getComparator();
+ assertTrue(reportsSorted);
+ } catch (IllegalStateException ex) {
+ assertFalse(reportsSorted);
+ }
+ }
+
// public void testCollection8DebugFail() {
// fail(impl.klazz().getSimpleName());
// }
--- a/jdk/test/java/util/concurrent/tck/JSR166TestCase.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/JSR166TestCase.java Wed Jul 05 22:38:24 2017 +0200
@@ -35,13 +35,30 @@
/*
* @test
- * @summary JSR-166 tck tests
+ * @summary JSR-166 tck tests (conformance testing mode)
+ * @build *
+ * @modules java.management
+ * @run junit/othervm/timeout=1000 JSR166TestCase
+ */
+
+/*
+ * @test
+ * @summary JSR-166 tck tests (whitebox tests allowed)
+ * @build *
* @modules java.base/java.util.concurrent:open
* java.management
- * @build *
- * @run junit/othervm/timeout=1000 -Djsr166.testImplementationDetails=true JSR166TestCase
- * @run junit/othervm/timeout=1000 -Djava.util.concurrent.ForkJoinPool.common.parallelism=0 -Djsr166.testImplementationDetails=true JSR166TestCase
- * @run junit/othervm/timeout=1000 -Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -Djava.util.secureRandomSeed=true JSR166TestCase
+ * @run junit/othervm/timeout=1000
+ * -Djsr166.testImplementationDetails=true
+ * JSR166TestCase
+ * @run junit/othervm/timeout=1000
+ * -Djsr166.testImplementationDetails=true
+ * -Djava.util.concurrent.ForkJoinPool.common.parallelism=0
+ * JSR166TestCase
+ * @run junit/othervm/timeout=1000
+ * -Djsr166.testImplementationDetails=true
+ * -Djava.util.concurrent.ForkJoinPool.common.parallelism=1
+ * -Djava.util.secureRandomSeed=true
+ * JSR166TestCase
*/
import static java.util.concurrent.TimeUnit.MILLISECONDS;
@@ -543,6 +560,8 @@
"DoubleAdderTest",
"ForkJoinPool8Test",
"ForkJoinTask8Test",
+ "LinkedBlockingDeque8Test",
+ "LinkedBlockingQueue8Test",
"LongAccumulatorTest",
"LongAdderTest",
"SplittableRandomTest",
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/tck/LinkedBlockingDeque8Test.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea and Martin Buchholz with assistance from
+ * members of JCP JSR-166 Expert Group and released to the public
+ * domain, as explained at
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.Spliterator;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class LinkedBlockingDeque8Test extends JSR166TestCase {
+ public static void main(String[] args) {
+ main(suite(), args);
+ }
+
+ public static Test suite() {
+ return newTestSuite(LinkedBlockingDeque8Test.class);
+ }
+
+ /**
+ * Spliterator.getComparator always throws IllegalStateException
+ */
+ public void testSpliterator_getComparator() {
+ assertThrows(IllegalStateException.class,
+ () -> new LinkedBlockingDeque().spliterator().getComparator());
+ }
+
+ /**
+ * Spliterator characteristics are as advertised
+ */
+ public void testSpliterator_characteristics() {
+ LinkedBlockingDeque q = new LinkedBlockingDeque();
+ Spliterator s = q.spliterator();
+ int characteristics = s.characteristics();
+ int required = Spliterator.CONCURRENT
+ | Spliterator.NONNULL
+ | Spliterator.ORDERED;
+ assertEquals(required, characteristics & required);
+ assertTrue(s.hasCharacteristics(required));
+ assertEquals(0, characteristics
+ & (Spliterator.DISTINCT
+ | Spliterator.IMMUTABLE
+ | Spliterator.SORTED));
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/tck/LinkedBlockingQueue8Test.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,76 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * This file is available under and governed by the GNU General Public
+ * License version 2 only, as published by the Free Software Foundation.
+ * However, the following notice accompanied the original version of this
+ * file:
+ *
+ * Written by Doug Lea and Martin Buchholz with assistance from
+ * members of JCP JSR-166 Expert Group and released to the public
+ * domain, as explained at
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.Spliterator;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class LinkedBlockingQueue8Test extends JSR166TestCase {
+ public static void main(String[] args) {
+ main(suite(), args);
+ }
+
+ public static Test suite() {
+ return newTestSuite(LinkedBlockingQueue8Test.class);
+ }
+
+ /**
+ * Spliterator.getComparator always throws IllegalStateException
+ */
+ public void testSpliterator_getComparator() {
+ assertThrows(IllegalStateException.class,
+ () -> new LinkedBlockingQueue().spliterator().getComparator());
+ }
+
+ /**
+ * Spliterator characteristics are as advertised
+ */
+ public void testSpliterator_characteristics() {
+ LinkedBlockingQueue q = new LinkedBlockingQueue();
+ Spliterator s = q.spliterator();
+ int characteristics = s.characteristics();
+ int required = Spliterator.CONCURRENT
+ | Spliterator.NONNULL
+ | Spliterator.ORDERED;
+ assertEquals(required, characteristics & required);
+ assertTrue(s.hasCharacteristics(required));
+ assertEquals(0, characteristics
+ & (Spliterator.DISTINCT
+ | Spliterator.IMMUTABLE
+ | Spliterator.SORTED));
+ }
+
+}
--- a/jdk/test/java/util/concurrent/tck/ScheduledExecutorSubclassTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/ScheduledExecutorSubclassTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -71,9 +71,9 @@
}
static class CustomTask<V> implements RunnableScheduledFuture<V> {
- RunnableScheduledFuture<V> task;
+ private final RunnableScheduledFuture<V> task;
volatile boolean ran;
- CustomTask(RunnableScheduledFuture<V> t) { task = t; }
+ CustomTask(RunnableScheduledFuture<V> task) { this.task = task; }
public boolean isPeriodic() { return task.isPeriodic(); }
public void run() {
ran = true;
--- a/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/SubmissionPublisherTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -402,6 +402,7 @@
/**
* Closing a publisher exceptionally causes onError to subscribers
+ * after they are subscribed
*/
public void testCloseExceptionallyError() {
SubmissionPublisher<Integer> p = basicPublisher();
@@ -412,9 +413,11 @@
p.submit(1);
p.closeExceptionally(new SPException());
assertTrue(p.isClosed());
+ s1.awaitSubscribe();
s1.awaitError();
assertTrue(s1.nexts <= 1);
assertEquals(1, s1.errors);
+ s2.awaitSubscribe();
s2.awaitError();
assertTrue(s2.nexts <= 1);
assertEquals(1, s2.errors);
--- a/jdk/test/java/util/concurrent/tck/ThreadLocalRandomTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/ThreadLocalRandomTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -85,32 +85,41 @@
*/
public void testNext() throws ReflectiveOperationException {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
+ final java.lang.reflect.Method m;
try {
- java.lang.reflect.Method m
- = ThreadLocalRandom.class.getDeclaredMethod(
+ m = ThreadLocalRandom.class.getDeclaredMethod(
"next", new Class[] { int.class });
m.setAccessible(true);
-
- int i;
- {
- int val = new java.util.Random().nextInt(4);
- for (i = 0; i < NCALLS; i++) {
- int q = (int) m.invoke(rnd, new Object[] { 2 });
- if (val == q) break;
- }
- assertTrue(i < NCALLS);
- }
+ } catch (SecurityException acceptable) {
+ // Security manager may deny access
+ return;
+ } catch (Exception ex) {
+ // jdk9 module system may deny access
+ if (ex.getClass().getSimpleName()
+ .equals("InaccessibleObjectException"))
+ return;
+ throw ex;
+ }
- {
- int r = (int) m.invoke(rnd, new Object[] { 3 });
- for (i = 0; i < NCALLS; i++) {
- int q = (int) m.invoke(rnd, new Object[] { 3 });
- assertTrue(q < (1<<3));
- if (r != q) break;
- }
- assertTrue(i < NCALLS);
+ int i;
+ {
+ int val = new java.util.Random().nextInt(4);
+ for (i = 0; i < NCALLS; i++) {
+ int q = (int) m.invoke(rnd, new Object[] { 2 });
+ if (val == q) break;
}
- } catch (SecurityException acceptable) {}
+ assertTrue(i < NCALLS);
+ }
+
+ {
+ int r = (int) m.invoke(rnd, new Object[] { 3 });
+ for (i = 0; i < NCALLS; i++) {
+ int q = (int) m.invoke(rnd, new Object[] { 3 });
+ assertTrue(q < (1<<3));
+ if (r != q) break;
+ }
+ assertTrue(i < NCALLS);
+ }
}
/**
--- a/jdk/test/java/util/concurrent/tck/VectorTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/java/util/concurrent/tck/VectorTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -58,9 +58,22 @@
}
}
return newTestSuite(
- // VectorTest.class,
+ VectorTest.class,
CollectionTest.testSuite(new Implementation()),
CollectionTest.testSuite(new SubListImplementation()));
}
+ /**
+ * tests for setSize()
+ */
+ public void testSetSize() {
+ Vector v = new Vector();
+ for (int n : new int[] { 100, 5, 50 }) {
+ v.setSize(n);
+ assertEquals(n, v.size());
+ assertNull(v.get(0));
+ assertNull(v.get(n - 1));
+ }
+ }
+
}
--- a/jdk/test/javax/net/ssl/templates/SSLSocketTemplate.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/javax/net/ssl/templates/SSLSocketTemplate.java Wed Jul 05 22:38:24 2017 +0200
@@ -176,6 +176,13 @@
}
/*
+ * Configure the server side socket.
+ */
+ protected void configureServerSocket(SSLServerSocket socket) {
+
+ }
+
+ /*
* =============================================
* Define the client and server side operations.
*
@@ -211,6 +218,7 @@
SSLServerSocketFactory sslssf = context.getServerSocketFactory();
SSLServerSocket sslServerSocket =
(SSLServerSocket)sslssf.createServerSocket(serverPort);
+ configureServerSocket(sslServerSocket);
serverPort = sslServerSocket.getLocalPort();
// Signal the client, the server is ready to accept connection.
--- a/jdk/test/javax/swing/JFileChooser/4847375/bug4847375.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/javax/swing/JFileChooser/4847375/bug4847375.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,11 +23,11 @@
/*
* @test
- * @bug 4847375
+ * @bug 4847375 8171363
* @summary JFileChooser Create New Folder button is disabled incorrectly
* @author Pavel Porvatov
* @modules java.desktop/sun.awt
- * java.desktop/sun.awt.shell
+ * java.desktop/sun.awt.shell:+open
*/
import sun.awt.OSInfo;
--- a/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/javax/swing/JFileChooser/6741890/bug6741890.java Wed Jul 05 22:38:24 2017 +0200
@@ -22,11 +22,11 @@
*/
/* @test
- @bug 6741890
+ @bug 6741890 8171363
@summary Deadlock in Win32ShellFolderManager2
@author Pavel Porvatov
@modules java.desktop/sun.awt
- java.desktop/sun.awt.shell
+ java.desktop/sun.awt.shell:+open
@run main bug6741890
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JRadioButton/ButtonGroupFocus/ButtonGroupFocusTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8074883
+ * @summary Tab key should move to focused button in a button group
+ * @run main ButtonGroupFocusTest
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+
+public class ButtonGroupFocusTest {
+
+ private static JRadioButton button1;
+ private static JRadioButton button2;
+ private static JRadioButton button3;
+ private static JRadioButton button4;
+ private static JRadioButton button5;
+ private static Robot robot;
+ private static JFrame frame;
+
+ public static void main(String[] args) throws Exception {
+ robot = new Robot();
+ robot.setAutoDelay(100);
+
+ SwingUtilities.invokeAndWait(() -> {
+ frame = new JFrame();
+ Container contentPane = frame.getContentPane();
+ contentPane.setLayout(new FlowLayout());
+ button1 = new JRadioButton("Button 1");
+ contentPane.add(button1);
+ button2 = new JRadioButton("Button 2");
+ contentPane.add(button2);
+ button3 = new JRadioButton("Button 3");
+ contentPane.add(button3);
+ button4 = new JRadioButton("Button 4");
+ contentPane.add(button4);
+ button5 = new JRadioButton("Button 5");
+ contentPane.add(button5);
+ ButtonGroup group = new ButtonGroup();
+ group.add(button1);
+ group.add(button2);
+ group.add(button3);
+
+ group = new ButtonGroup();
+ group.add(button4);
+ group.add(button5);
+
+ button2.setSelected(true);
+
+ frame.pack();
+ frame.setVisible(true);
+ });
+
+ robot.waitForIdle();
+ robot.delay(200);
+
+ SwingUtilities.invokeAndWait(() -> {
+ if( !button2.hasFocus() ) {
+ frame.dispose();
+ throw new RuntimeException(
+ "Button 2 should get focus after activation");
+ }
+ });
+
+ robot.keyPress(KeyEvent.VK_TAB);
+ robot.keyRelease(KeyEvent.VK_TAB);
+
+ robot.waitForIdle();
+ robot.delay(200);
+
+ SwingUtilities.invokeAndWait(() -> {
+ if( !button4.hasFocus() ) {
+ frame.dispose();
+ throw new RuntimeException(
+ "Button 4 should get focus");
+ }
+ button3.setSelected(true);
+ });
+
+ robot.keyPress(KeyEvent.VK_TAB);
+ robot.keyRelease(KeyEvent.VK_TAB);
+
+ robot.waitForIdle();
+ robot.delay(200);
+
+ SwingUtilities.invokeAndWait(() -> {
+ if( !button3.hasFocus() ) {
+ frame.dispose();
+ throw new RuntimeException(
+ "selected Button 3 should get focus");
+ }
+ });
+
+ SwingUtilities.invokeLater(frame::dispose);
+ }
+}
--- a/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/javax/xml/ws/xsanymixed/compile-wsdl.sh Wed Jul 05 22:38:24 2017 +0200
@@ -1,7 +1,7 @@
#! /bin/sh
#
-# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2014, 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,12 @@
#
-if [ "x$TESTJAVA" = x ]; then
- TESTJAVA=$1; shift
+if [ "x$COMPILEJAVA" = x ]; then
+ COMPILEJAVA=$1; shift
TESTCLASSES=.
fi
echo "compiling [test-service.wsdl] wsdl ..."
-$TESTJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl
+$COMPILEJAVA/bin/wsimport -keep -d ${TESTCLASSES} ${TESTSRC}/service.wsdl
echo "WSDL compiled. Main test class Test.java can be compiled now."
--- a/jdk/test/sun/rmi/transport/tcp/DeadCachedConnection.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/sun/rmi/transport/tcp/DeadCachedConnection.java Wed Jul 05 22:38:24 2017 +0200
@@ -29,7 +29,7 @@
* java.rmi/sun.rmi.server
* java.rmi/sun.rmi.transport
* java.rmi/sun.rmi.transport.tcp
- * @build TestLibrary JavaVM
+ * @build TestLibrary REGISTRY RegistryRunner
* @run main/othervm DeadCachedConnection
*/
@@ -60,73 +60,65 @@
import java.rmi.server.*;
public class DeadCachedConnection {
- static public final int regport = TestLibrary.getUnusedRandomPort();
static public void main(String[] argv)
throws Exception {
- // establish the registry (we hope)
- System.err.println ("Starting registry on port " + regport);
- DeadCachedConnection.makeRegistry(regport);
+ try {
+ Registry reg = null;
+ int port = makeRegistry(0);
- // Get a handle to the registry
- Registry reg = null;
- System.err.println ("Locating just-started registry...");
- try {
- reg = LocateRegistry.getRegistry(regport);
- } catch (RemoteException e) {
- throw new InternalError ("Can't find registry after starting it.");
- }
+ // Get a handle to the registry
+ System.err.println ("Locating just-started registry...");
+ try {
+ reg = LocateRegistry.getRegistry(port);
+ } catch (RemoteException e) {
+ throw new InternalError ("Can't find registry after starting it.");
+ }
+
+ // Contact the registry by invoking something on it.
+ System.err.println ("Connecting to registry...");
+ String[] junk = reg.list();
- // Contact the registry by invoking something on it.
- System.err.println ("Connecting to registry...");
- String[] junk = reg.list();
-
- // Kill and restart the registry
- System.err.println("Killing registry...");
- DeadCachedConnection.killRegistry();
- System.err.println("Restarting registry...");
- DeadCachedConnection.makeRegistry(regport);
+ // Kill and restart the registry
+ System.err.println("Killing registry...");
+ killRegistry();
+ System.err.println("Restarting registry...");
+ makeRegistry(port);
- // Try again (this is the test)
- System.err.println("Trying to use registry in spite of stale cache...");
- junk = reg.list();
+ // Try again (this is the test)
+ System.err.println("Trying to use registry in spite of stale cache...");
+ junk = reg.list();
- // we're happy
- System.err.println("Test succeeded.");
- try {
- DeadCachedConnection.killRegistry();
- } catch (Exception foo) {
+ System.err.println("Test succeeded.");
+ } catch (Exception e) {
+ TestLibrary.bomb(e);
+ } finally {
+ // dont leave the registry around to affect other tests.
+ killRegistry();
}
}
- public static void makeRegistry(int p) {
- // sadly, we can't kill a registry if we have too-close control
- // over it. We must make it in a subprocess, and then kill the
- // subprocess when it has served our needs.
-
+ public static int makeRegistry(int port) {
try {
- JavaVM jvm =
- new JavaVM("sun.rmi.registry.RegistryImpl", "", Integer.toString(p));
- jvm.start();
- DeadCachedConnection.subreg = jvm;
-
+ subreg = REGISTRY.createREGISTRY(System.out, System.err, "", port);
+ subreg.start();
+ int regPort = subreg.getPort();
+ System.out.println("Starting registry on port " + regPort);
+ return regPort;
} catch (IOException e) {
// one of these is summarily dropped, can't remember which one
System.out.println ("Test setup failed - cannot run rmiregistry");
TestLibrary.bomb("Test setup failed - cannot run test", e);
}
- // Slop - wait for registry to come up. This is stupid.
- try {
- Thread.sleep (5000);
- } catch (Exception whatever) {
+ return -1;
+ }
+
+ private static REGISTRY subreg = null;
+
+ public static void killRegistry() throws InterruptedException {
+ if (subreg != null) {
+ subreg.shutdown();
+ subreg = null;
}
}
- private static JavaVM subreg = null;
-
- public static void killRegistry() throws InterruptedException {
- if (DeadCachedConnection.subreg != null) {
- DeadCachedConnection.subreg.terminate();
- }
- DeadCachedConnection.subreg = null;
- }
}
--- a/jdk/test/sun/security/ssl/SSLContextImpl/TrustTrustedCert.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/sun/security/ssl/SSLContextImpl/TrustTrustedCert.java Wed Jul 05 22:38:24 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -32,6 +32,7 @@
* @test
* @bug 7113275 8164846
* @summary compatibility issue with MD2 trust anchor and old X509TrustManager
+ * @library /javax/net/ssl/templates
* @run main/othervm TrustTrustedCert PKIX TLSv1.1 true
* @run main/othervm TrustTrustedCert PKIX TLSv1.1 false
* @run main/othervm TrustTrustedCert SunX509 TLSv1.1 false
@@ -40,7 +41,6 @@
*/
import java.net.*;
-import java.util.*;
import java.io.*;
import javax.net.ssl.*;
import java.security.*;
@@ -49,21 +49,7 @@
import java.security.interfaces.*;
import java.util.Base64;
-
-public class TrustTrustedCert {
-
- /*
- * =============================================================
- * Set the various variables needed for the tests, then
- * specify what tests to run on each side.
- */
-
- /*
- * Should we run the client or server in a separate thread?
- * Both sides can throw exceptions, but do you have a preference
- * as to which side should be the main thread.
- */
- static boolean separateServerThread = false;
+public class TrustTrustedCert extends SSLSocketTemplate {
/*
* Certificates and key used in the test.
@@ -124,89 +110,61 @@
"A5kokFb+E3Gplu29tJvCUpfwgBFRS+wmkvtiaU/tiyDcVgDO+An5DwedxxdVzqiE\n" +
"njWHoKY3axDQ8OU=\n";
-
static char passphrase[] = "passphrase".toCharArray();
- /*
- * Is the server ready to serve?
- */
- volatile static boolean serverReady = false;
-
- /*
- * Turn on SSL debugging?
- */
- static boolean debug = false;
+ @Override
+ protected SSLContext createServerSSLContext() throws Exception {
+ return generateSSLContext();
+ }
- /*
- * Define the server side of the test.
- *
- * If the server prematurely exits, serverReady will be set to true
- * to avoid infinite hangs.
- */
- void doServerSide() throws Exception {
- SSLContext context = generateSSLContext();
- SSLServerSocketFactory sslssf = context.getServerSocketFactory();
- SSLServerSocket sslServerSocket =
- (SSLServerSocket)sslssf.createServerSocket(serverPort);
- sslServerSocket.setNeedClientAuth(true);
- serverPort = sslServerSocket.getLocalPort();
-
- /*
- * Signal Client, we're ready for his connect.
- */
- serverReady = true;
-
- SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept();
- InputStream sslIS = sslSocket.getInputStream();
- OutputStream sslOS = sslSocket.getOutputStream();
-
- sslIS.read();
- sslOS.write('A');
- sslOS.flush();
-
- sslSocket.close();
+ @Override
+ protected void configureServerSocket(SSLServerSocket socket) {
+ socket.setNeedClientAuth(true);
}
- /*
- * Define the client side of the test.
- *
- * If the server prematurely exits, serverReady will be set to true
- * to avoid infinite hangs.
- */
- void doClientSide() throws Exception {
+ @Override
+ protected void runServerApplication(SSLSocket socket) throws Exception {
+ InputStream sslIS = socket.getInputStream();
+ OutputStream sslOS = socket.getOutputStream();
- /*
- * Wait for server to get started.
- */
- while (!serverReady) {
- Thread.sleep(50);
+ try {
+ sslIS.read();
+ sslOS.write('A');
+ sslOS.flush();
+ } catch (SSLHandshakeException e) {
+ if (expectFail && !e.toString().contains("certificate_unknown")) {
+ throw new RuntimeException(
+ "Expected to see certificate_unknown in exception output",
+ e);
+ }
}
+ }
- SSLSocket sslSocket = null;
- try {
- SSLContext context = generateSSLContext();
- SSLSocketFactory sslsf = context.getSocketFactory();
+ @Override
+ protected SSLContext createClientSSLContext() throws Exception {
+ return generateSSLContext();
+ }
- sslSocket = (SSLSocket)sslsf.createSocket("localhost", serverPort);
+ @Override
+ protected void runClientApplication(SSLSocket socket) throws Exception {
+ // enable the specified TLS protocol
+ socket.setEnabledProtocols(new String[] { tlsProtocol });
- // enable the specified TLS protocol
- sslSocket.setEnabledProtocols(new String[] {tlsProtocol});
+ InputStream sslIS = socket.getInputStream();
+ OutputStream sslOS = socket.getOutputStream();
- InputStream sslIS = sslSocket.getInputStream();
- OutputStream sslOS = sslSocket.getOutputStream();
+ try {
sslOS.write('B');
sslOS.flush();
sslIS.read();
} catch (SSLHandshakeException e) {
- // focus in on the CertPathValidatorException
+ // focus on the CertPathValidatorException
Throwable t = e.getCause().getCause();
- if ((t == null) || (expectFail &&
- !t.toString().contains("MD5withRSA"))) {
+ if ((t == null)
+ || (expectFail && !t.toString().contains("MD5withRSA"))) {
throw new RuntimeException(
- "Expected to see MD5withRSA in exception output " + t);
+ "Expected to see MD5withRSA in exception output", t);
}
- } finally {
- if (sslSocket != null) sslSocket.close();
}
}
@@ -343,13 +301,6 @@
}
}
-
- // use any free port by default
- volatile int serverPort = 0;
-
- volatile Exception serverException = null;
- volatile Exception clientException = null;
-
public static void main(String[] args) throws Exception {
/*
* Get the customized arguments.
@@ -367,144 +318,9 @@
Security.setProperty("jdk.tls.disabledAlgorithms",
"SSLv3, RC4, DH keySize < 768");
- if (debug)
- System.setProperty("javax.net.debug", "all");
-
/*
* Start the tests.
*/
- new TrustTrustedCert();
- }
-
- Thread clientThread = null;
- Thread serverThread = null;
-
- /*
- * Primary constructor, used to drive remainder of the test.
- *
- * Fork off the other side, then do your work.
- */
- TrustTrustedCert() throws Exception {
- try {
- if (separateServerThread) {
- startServer(true);
- startClient(false);
- } else {
- startClient(true);
- startServer(false);
- }
- } catch (Exception e) {
- System.out.println("Unexpected exception: ");
- e.printStackTrace();
- }
-
- /*
- * Wait for other side to close down.
- */
- if (separateServerThread) {
- serverThread.join();
- } else {
- clientThread.join();
- }
-
- /*
- * When we get here, the test is pretty much over.
- * Which side threw the error?
- */
- Exception local;
- Exception remote;
- String whichRemote;
-
- if (separateServerThread) {
- remote = serverException;
- local = clientException;
- whichRemote = "server";
- } else {
- remote = clientException;
- local = serverException;
- whichRemote = "client";
- }
-
- /*
- * If both failed, return the curthread's exception, but also
- * print the remote side Exception
- */
- if ((local != null) && (remote != null)) {
- System.out.println(whichRemote + " also threw:");
- remote.printStackTrace();
- System.out.println();
- throw local;
- }
-
- if (remote != null) {
- throw remote;
- }
-
- if (local != null) {
- throw local;
- }
- }
-
- void startServer(boolean newThread) throws Exception {
- if (newThread) {
- serverThread = new Thread() {
- public void run() {
- try {
- doServerSide();
- } catch (Exception e) {
- /*
- * Our server thread just died.
- *
- * Release the client, if not active already...
- */
- System.err.println("Server died...");
- serverReady = true;
- if (!expectFail) {
- // only record if we weren't expecting.
- // client side will record exception
- serverException = e;
- }
- }
- }
- };
- serverThread.start();
- } else {
- try {
- doServerSide();
- } catch (Exception e) {
- // only record if we weren't expecting.
- // client side will record exception
- if (!expectFail) {
- serverException = e;
- }
- } finally {
- serverReady = true;
- }
- }
- }
-
- void startClient(boolean newThread) throws Exception {
- if (newThread) {
- clientThread = new Thread() {
- public void run() {
- try {
- doClientSide();
- } catch (Exception e) {
- /*
- * Our client thread just died.
- */
- System.err.println("Client died...");
- clientException = e;
- }
- }
- };
- clientThread.start();
- } else {
- try {
- doClientSide();
- } catch (Exception e) {
- clientException = e;
- }
- }
+ new TrustTrustedCert().run();
}
}
--- a/jdk/test/sun/util/locale/provider/Bug8038436.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/sun/util/locale/provider/Bug8038436.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8038436 8158504 8065555
+ * @bug 8038436 8158504 8065555 8167143
* @summary Test for changes in 8038436
* @modules java.base/sun.util.locale.provider
* java.base/sun.util.spi
@@ -120,7 +120,7 @@
"fi, fi-FI, fr, fr-BE, fr-CA, fr-CH, fr-FR, ga, ga-IE, he, he-IL, " +
"hi-IN, hr, hr-HR, hu, hu-HU, id, id-ID, is, is-IS, it, it-CH, it-IT, " +
"ja, ja-JP, ko, ko-KR, lt, lt-LT, lv, lv-LV, mk, mk-MK, ms, ms-MY, mt, " +
- "mt-MT, nl, nl-BE, nl-NL, no, no-NO, no-NO, pl, pl-PL, pt, pt-BR, " +
+ "mt-MT, nb-NO, nl, nl-BE, nl-NL, nn-NO, no, no-NO, no-NO, pl, pl-PL, pt, pt-BR, " +
"pt-PT, ro, ro-RO, ru, ru-RU, sk, sk-SK, sl, sl-SI, sq, sq-AL, sr, " +
"sr-BA, sr-CS, sr-Latn, sr-Latn-ME, sr-ME, sr-RS, sv, sv-SE, th, th-TH, " +
"tr, tr-TR, uk, uk-UA, und, vi, vi-VN, zh, zh-CN, zh-HK, zh-Hans-CN, " +
@@ -130,7 +130,7 @@
static final String[] decimalfspLocs = bipLocs;
static final String[] calnpLocs = bipLocs;
static final String[] cpLocs = ("ar, be, bg, ca, cs, da, el, es, et, fi, " +
- "fr, he, hi, hr, hu, is, ja, ko, lt, lv, mk, no, pl, ro, ru, sk, sl, " +
+ "fr, he, hi, hr, hu, is, ja, ko, lt, lv, mk, nb-NO, nn-NO, no, pl, ro, ru, sk, sl, " +
"sq, sr, sr-Latn, sv, th, tr, uk, und, vi, zh, zh-HK, zh-Hant-HK, " +
"zh-Hant-TW, zh-TW, ").split(",\\s*");
static final String[] nfpLocs = ("ar, ar-AE, ar-BH, ar-DZ, ar-EG, ar-IQ, " +
@@ -160,22 +160,22 @@
"es-PA, es-PE, es-PR, es-PY, es-SV, es-US, es-UY, es-VE, et-EE, fi-FI, " +
"fr, fr-BE, fr-CA, fr-CH, fr-FR, fr-LU, ga-IE, he-IL, hi-IN, hr-HR, " +
"hu-HU, id-ID, is-IS, it, it-CH, it-IT, ja, ja-JP, ko, ko-KR, lt-LT, " +
- "lv-LV, mk-MK, ms-MY, mt-MT, nl-BE, nl-NL, no-NO, pl-PL, pt, pt-BR, " +
+ "lv-LV, mk-MK, ms-MY, mt-MT, nb-NO, nl-BE, nl-NL, nn-NO, no-NO, pl-PL, pt, pt-BR, " +
"pt-PT, ro-RO, ru-RU, sk-SK, sl-SI, sq-AL, sr-BA, sr-CS, sr-Latn-BA, " +
"sr-Latn-ME, sr-Latn-RS, sr-ME, sr-RS, sv, sv-SE, th-TH, tr-TR, uk-UA, " +
"und, vi-VN, zh-CN, zh-HK, zh-Hans-CN, zh-Hans-SG, zh-Hant-HK, " +
"zh-Hant-TW, zh-SG, zh-TW, ").split(",\\s*");
static final String[] lnpLocs = ("ar, be, bg, ca, cs, da, de, el, el-CY, " +
"en, en-MT, en-PH, en-SG, es, es-US, et, fi, fr, ga, he, hi, hr, hu, " +
- "id, is, it, ja, ko, lt, lv, mk, ms, mt, nl, no, no-NO, pl, pt, pt-BR, " +
+ "id, is, it, ja, ko, lt, lv, mk, ms, mt, nb-NO, nl, nn-NO, no, no-NO, pl, pt, pt-BR, " +
"pt-PT, ro, ru, sk, sl, sq, sr, sr-Latn, sv, th, tr, uk, und, vi, zh, " +
"zh-HK, zh-Hans-SG, zh-Hant-HK, zh-Hant-TW, zh-SG, zh-TW, ").split(",\\s*");
static final String[] tznpLocs = ("de, en, en-CA, en-GB, en-IE, es, fr, hi, " +
- "it, ja, ko, pt-BR, sv, und, zh-CN, zh-HK, zh-Hans-CN, zh-Hant-HK, " +
+ "it, ja, ko, nb-NO, nn-NO, pt-BR, sv, und, zh-CN, zh-HK, zh-Hans-CN, zh-Hant-HK, " +
"zh-Hant-TW, zh-TW, ").split(",\\s*");
static final String[] caldpLocs = ("ar, be, bg, ca, cs, da, de, el, el-CY, " +
"en, en-GB, en-IE, en-MT, es, es-ES, es-US, et, fi, fr, fr-CA, he, hi, " +
- "hr, hu, id-ID, is, it, ja, ko, lt, lv, mk, ms-MY, mt, mt-MT, nl, no, " +
+ "hr, hu, id-ID, is, it, ja, ko, lt, lv, mk, ms-MY, mt, mt-MT, nb-NO, nl, nn-NO, no, " +
"pl, pt, pt-BR, pt-PT, ro, ru, sk, sl, sq, sr, sr-Latn-BA, sr-Latn-ME, " +
"sr-Latn-RS, sv, th, tr, uk, und, vi, zh, ").split(",\\s*");
static final String[] calpLocs = caldpLocs;
--- a/jdk/test/tools/jmod/JmodTest.java Thu Dec 22 18:48:23 2016 +0000
+++ b/jdk/test/tools/jmod/JmodTest.java Wed Jul 05 22:38:24 2017 +0200
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8142968 8166568
+ * @bug 8142968 8166568 8166286 8170618
* @summary Basic test for jmod
* @library /lib/testlibrary
* @modules jdk.compiler
@@ -114,6 +114,27 @@
.assertSuccess();
}
+ // JDK-8170618 - jmod should validate if any exported or open package is missing
+ @Test
+ public void testMissingPackages() throws IOException {
+ Path apaDir = EXPLODED_DIR.resolve("apa");
+ Path classesDir = EXPLODED_DIR.resolve("apa").resolve("classes");
+ if (Files.exists(classesDir))
+ FileUtils.deleteFileTreeWithRetry(classesDir);
+ assertTrue(compileModule("apa", classesDir));
+ FileUtils.deleteFileTreeWithRetry(classesDir.resolve("jdk"));
+ Path jmod = MODS_DIR.resolve("apa.jmod");
+ jmod("create",
+ "--class-path", classesDir.toString(),
+ jmod.toString())
+ .assertFailure()
+ .resultChecker(r -> {
+ assertContains(r.output, "Packages that are exported or open in apa are not present: [jdk.test.apa]");
+ });
+ if (Files.exists(classesDir))
+ FileUtils.deleteFileTreeWithRetry(classesDir);
+ }
+
@Test
public void testList() throws IOException {
String cp = EXPLODED_DIR.resolve("foo").resolve("classes").toString();
--- a/make/Bundles.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/make/Bundles.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -103,7 +103,7 @@
$(CD) $$($1_BASE_DIRS) \
&& ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \
-$(TAR_INCLUDE_PARAM) $$($1_$$($1_BASE_DIRS)_LIST_FILE) \
- $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|') \
+ $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|S') \
$(TAR_IGNORE_EXIT_VALUE) ) \
| $(GZIP) > $$@
else
--- a/make/CompileJavaModules.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/make/CompileJavaModules.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -363,6 +363,10 @@
################################################################################
+jdk.jshell_COPY := .jsh .properties
+
+################################################################################
+
jdk.internal.le_COPY := .properties
################################################################################
--- a/make/Javadoc.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/make/Javadoc.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -148,10 +148,10 @@
# arg 2: copyright url (optional)
# arg 3: free-form text snippet (optional)
define GenerateBottom
- <font size="-1">$(if $(strip $3), $(strip $3))<br> $(if \
+ <span style="font-size:smaller">$(if $(strip $3), $(strip $3))<br> $(if \
$(strip $2),<a href="$(strip $2)">Copyright</a>,Copyright) \
© $(strip $1), $(COPYRIGHT_YEAR), $(FULL_COMPANY_NAME). \
- $(COMPANY_ADDRESS). All rights reserved.</font>
+ $(COMPANY_ADDRESS). All rights reserved.</span>
endef
# Speed up finding by filling cache
--- a/make/SourceRevision.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/make/SourceRevision.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -105,7 +105,7 @@
# We have a stored source revision (.src-rev)
store-source-revision:
- $(call LogWarn, Warning: No mercurial configuration present, not updating .src-rev)
+ $(call LogInfo, No mercurial configuration present$(COMMA) not updating .src-rev)
$(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION)
$(install-file)
@@ -115,7 +115,7 @@
# We don't have a stored source revision. Can't do anything, really.
store-source-revision:
- $(call LogWarn, Error: No mercurial configuration present, cannot create .src-rev)
+ $(call LogWarn, Error: No mercurial configuration present$(COMMA) cannot create .src-rev)
exit 2
create-source-revision-tracker:
--- a/make/common/NativeCompilation.gmk Thu Dec 22 18:48:23 2016 +0000
+++ b/make/common/NativeCompilation.gmk Wed Jul 05 22:38:24 2017 +0200
@@ -371,7 +371,8 @@
# when compiling C code
# DISABLED_WARNINGS_CXX_<toolchain> Disable the given warnings for the specified
# toolchain when compiling C++ code
-# STRIP_SYMBOLS Set to true to strip the final binary if the toolchain allows for it
+# STRIP_SYMBOLS Set to false to override global strip policy and always leave
+# symbols in the binary, if the toolchain allows for it
# DEBUG_SYMBOLS Set to false to disable generation of debug symbols
# COPY_DEBUG_SYMBOLS Set to false to override global setting of debug symbol copying
# ZIP_EXTERNAL_DEBUG_SYMBOLS Set to false to override global setting of debug symbol
@@ -886,6 +887,10 @@
endif # $1_DEBUG_SYMBOLS != false
endif # COPY_DEBUG_SYMBOLS
+ # Unless specifically set, stripping should only happen if symbols are also
+ # being copied.
+ $$(call SetIfEmpty, $1_STRIP_SYMBOLS, $$($1_COPY_DEBUG_SYMBOLS))
+
ifneq ($$($1_STRIP_SYMBOLS), false)
ifneq ($$($1_STRIP), )
# Default to using the global STRIPFLAGS. Allow for overriding with an empty value
--- a/make/jprt.properties Thu Dec 22 18:48:23 2016 +0000
+++ b/make/jprt.properties Wed Jul 05 22:38:24 2017 +0200
@@ -45,6 +45,7 @@
jprt.build.use.jib=true
jprt.test.use.jib=true
jprt.jib.launcher=common/bin/jib.sh
+jprt.build.use.jib.publish=true
# Clear out all the build needs as JIB handles this
jprt.jdk9.build.needs=
@@ -124,7 +125,7 @@
jprt.linux_i586.fastdebugZero.build.jib.profile=linux-x86-zero-debug
jprt.linux_x64.fastdebugZero.build.jib.profile=linux-x64-zero-debug
-jprt.test.jib.profile=run-test
+jprt.test.jib.profile=run-test-jprt
# Set make target to use for different build flavors
jprt.build.flavor.fastdebugOpen.target=jprt_bundle
@@ -189,7 +190,7 @@
jprt.build.configure.args= \
--with-output-sync=recurse \
--with-jobs=$ALT_PARALLEL_COMPILE_JOBS \
- --with-version-opt=$JPRT_JOB_ID \
+ --with-version-opt=$JPRT_JOB_ID \
${my.additional.build.configure.args.${jprt.test.set}} \
${my.custom.build.configure.args}
--- a/test/lib/jdk/test/lib/hprof/parser/HprofReader.java Thu Dec 22 18:48:23 2016 +0000
+++ b/test/lib/jdk/test/lib/hprof/parser/HprofReader.java Wed Jul 05 22:38:24 2017 +0200
@@ -151,6 +151,10 @@
private Snapshot snapshot;
+ public static boolean verifyMagicNumber(int numberRead) {
+ return (numberRead == MAGIC_NUMBER);
+ }
+
public HprofReader(String fileName, PositionDataInputStream in,
int dumpNumber, boolean callStack, int debugLevel)
throws IOException {
@@ -737,6 +741,12 @@
long id = readID();
StackTrace stackTrace = getStackTraceFromSerial(in.readInt());
long classID = readID();
+ JavaClass searchedClass = snapshot.findClass(
+ "0x" + Long.toHexString(classID));
+ if (searchedClass == null) {
+ throw new IOException(
+ "Class Record for 0x" + Long.toHexString(classID) + " not found");
+ }
int bytesFollowing = in.readInt();
int bytesRead = (2 * identifierSize) + 8 + bytesFollowing;
JavaObject jobj = new JavaObject(classID, start);