8014138: Add VM option to facilitate the writing of CDS tests
Summary: Added the -XX:SharedArchiveFile option.
Reviewed-by: coleenp, ccheung, acorn, dcubed, zgu
--- a/hotspot/src/share/vm/runtime/arguments.cpp Tue May 14 11:34:30 2013 +0400
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Tue May 14 09:17:52 2013 -0400
@@ -3182,25 +3182,37 @@
}
#endif // INCLUDE_ALL_GCS
+// Sharing support
+// Construct the path to the archive
+static char* get_shared_archive_path() {
+ char *shared_archive_path;
+ if (SharedArchiveFile == NULL) {
+ char jvm_path[JVM_MAXPATHLEN];
+ os::jvm_path(jvm_path, sizeof(jvm_path));
+ char *end = strrchr(jvm_path, *os::file_separator());
+ if (end != NULL) *end = '\0';
+ size_t jvm_path_len = strlen(jvm_path);
+ size_t file_sep_len = strlen(os::file_separator());
+ shared_archive_path = NEW_C_HEAP_ARRAY(char, jvm_path_len +
+ file_sep_len + 20, mtInternal);
+ if (shared_archive_path != NULL) {
+ strncpy(shared_archive_path, jvm_path, jvm_path_len + 1);
+ strncat(shared_archive_path, os::file_separator(), file_sep_len);
+ strncat(shared_archive_path, "classes.jsa", 11);
+ }
+ } else {
+ shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(SharedArchiveFile) + 1, mtInternal);
+ if (shared_archive_path != NULL) {
+ strncpy(shared_archive_path, SharedArchiveFile, strlen(SharedArchiveFile) + 1);
+ }
+ }
+ return shared_archive_path;
+}
+
// Parse entry point called from JNI_CreateJavaVM
jint Arguments::parse(const JavaVMInitArgs* args) {
- // Sharing support
- // Construct the path to the archive
- char jvm_path[JVM_MAXPATHLEN];
- os::jvm_path(jvm_path, sizeof(jvm_path));
- char *end = strrchr(jvm_path, *os::file_separator());
- if (end != NULL) *end = '\0';
- char *shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(jvm_path) +
- strlen(os::file_separator()) + 20, mtInternal);
- if (shared_archive_path == NULL) return JNI_ENOMEM;
- strcpy(shared_archive_path, jvm_path);
- strcat(shared_archive_path, os::file_separator());
- strcat(shared_archive_path, "classes");
- strcat(shared_archive_path, ".jsa");
- SharedArchivePath = shared_archive_path;
-
// Remaining part of option string
const char* tail;
@@ -3291,6 +3303,12 @@
return result;
}
+ // Call get_shared_archive_path() here, after possible SharedArchiveFile option got parsed.
+ SharedArchivePath = get_shared_archive_path();
+ if (SharedArchivePath == NULL) {
+ return JNI_ENOMEM;
+ }
+
// Delay warning until here so that we've had a chance to process
// the -XX:-PrintWarnings flag
if (needs_hotspotrc_warning) {
--- a/hotspot/src/share/vm/runtime/globals.hpp Tue May 14 11:34:30 2013 +0400
+++ b/hotspot/src/share/vm/runtime/globals.hpp Tue May 14 09:17:52 2013 -0400
@@ -3677,6 +3677,9 @@
product(bool , AllowNonVirtualCalls, false, \
"Obey the ACC_SUPER flag and allow invokenonvirtual calls") \
\
+ diagnostic(ccstr, SharedArchiveFile, NULL, \
+ "Override the default location of the CDS archive file") \
+ \
experimental(uintx, ArrayAllocatorMallocLimit, \
SOLARIS_ONLY(64*K) NOT_SOLARIS(max_uintx), \
"Allocation less than this value will be allocated " \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/SharedArchiveFile/SharedArchiveFile.java Tue May 14 09:17:52 2013 -0400
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2013, 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 8014138
+ * @summary Testing new -XX:SharedArchiveFile=<file-name> option
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class SharedArchiveFile {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:dump");
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ try {
+ output.shouldContain("Loading classes to share");
+ output.shouldHaveExitValue(0);
+
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UnlockDiagnosticVMOptions", "-XX:SharedArchiveFile=./sample.jsa", "-Xshare:on", "-version");
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("sharing");
+ output.shouldHaveExitValue(0);
+
+ } catch (RuntimeException e) {
+ output.shouldContain("Unable to use shared archive");
+ output.shouldHaveExitValue(1);
+ }
+ }
+}