7176856: add the JRE name to the error log
Reviewed-by: coleenp, jrose, kvn, twisti
Contributed-by: Krystal Mok <sajia@taobao.com>
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Jun 18 09:52:31 2012 +0200
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Jun 18 12:29:21 2012 -0700
@@ -111,6 +111,10 @@
template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \
template(sun_misc_PostVMInitHook, "sun/misc/PostVMInitHook") \
\
+ /* Java runtime version access */ \
+ template(sun_misc_Version, "sun/misc/Version") \
+ template(java_runtime_name_name, "java_runtime_name") \
+ \
/* class file format tags */ \
template(tag_source_file, "SourceFile") \
template(tag_inner_classes, "InnerClasses") \
--- a/hotspot/src/share/vm/runtime/java.cpp Mon Jun 18 09:52:31 2012 +0200
+++ b/hotspot/src/share/vm/runtime/java.cpp Mon Jun 18 12:29:21 2012 -0700
@@ -660,6 +660,7 @@
}
JDK_Version JDK_Version::_current;
+const char* JDK_Version::_runtime_name;
void JDK_Version::initialize() {
jdk_version_info info;
--- a/hotspot/src/share/vm/runtime/java.hpp Mon Jun 18 09:52:31 2012 +0200
+++ b/hotspot/src/share/vm/runtime/java.hpp Mon Jun 18 12:29:21 2012 -0700
@@ -74,6 +74,7 @@
private:
static JDK_Version _current;
+ static const char* _runtime_name;
// In this class, we promote the minor version of release to be the
// major version for releases >= 5 in anticipation of the JDK doing the
@@ -181,6 +182,13 @@
void to_string(char* buffer, size_t buflen) const;
+ static const char* runtime_name() {
+ return _runtime_name;
+ }
+ static void set_runtime_name(const char* name) {
+ _runtime_name = name;
+ }
+
// Convenience methods for queries on the current major/minor version
static bool is_jdk12x_version() {
return current().compare_major(2) == 0;
--- a/hotspot/src/share/vm/runtime/thread.cpp Mon Jun 18 09:52:31 2012 +0200
+++ b/hotspot/src/share/vm/runtime/thread.cpp Mon Jun 18 12:29:21 2012 -0700
@@ -996,6 +996,29 @@
vmSymbols::void_method_signature(), CHECK);
}
+char java_runtime_name[128] = "";
+
+// extract the JRE name from sun.misc.Version.java_runtime_name
+static const char* get_java_runtime_name(TRAPS) {
+ klassOop k = SystemDictionary::find(vmSymbols::sun_misc_Version(),
+ Handle(), Handle(), CHECK_AND_CLEAR_NULL);
+ fieldDescriptor fd;
+ bool found = k != NULL &&
+ instanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_name_name(),
+ vmSymbols::string_signature(), &fd);
+ if (found) {
+ oop name_oop = k->java_mirror()->obj_field(fd.offset());
+ if (name_oop == NULL)
+ return NULL;
+ const char* name = java_lang_String::as_utf8_string(name_oop,
+ java_runtime_name,
+ sizeof(java_runtime_name));
+ return name;
+ } else {
+ return NULL;
+ }
+}
+
// General purpose hook into Java code, run once when the VM is initialized.
// The Java library method itself may be changed independently from the VM.
static void call_postVMInitHook(TRAPS) {
@@ -3352,6 +3375,9 @@
// The VM creates & returns objects of this class. Make sure it's initialized.
initialize_class(vmSymbols::java_lang_Class(), CHECK_0);
call_initializeSystemClass(CHECK_0);
+
+ // get the Java runtime name after java.lang.System is initialized
+ JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
} else {
warning("java.lang.System not initialized");
}
--- a/hotspot/src/share/vm/utilities/vmError.cpp Mon Jun 18 09:52:31 2012 +0200
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Mon Jun 18 12:29:21 2012 -0700
@@ -450,7 +450,9 @@
// VM version
st->print_cr("#");
JDK_Version::current().to_string(buf, sizeof(buf));
- st->print_cr("# JRE version: %s", buf);
+ const char* runtime_name = JDK_Version::runtime_name() != NULL ?
+ JDK_Version::runtime_name() : "";
+ st->print_cr("# JRE version: %s (%s)", runtime_name, buf);
st->print_cr("# Java VM: %s (%s %s %s %s)",
Abstract_VM_Version::vm_name(),
Abstract_VM_Version::vm_release(),