8002078: hs_err_pid file should report full JDK version string
authorsla
Thu, 01 Nov 2012 13:05:47 +0100
changeset 14289 aec758622b4b
parent 14288 a171bf7d0c99
child 14290 30e1775ed731
child 14385 959bbcc16725
8002078: hs_err_pid file should report full JDK version string Reviewed-by: dholmes, sspitsyn, kmo
hotspot/src/share/vm/classfile/vmSymbols.hpp
hotspot/src/share/vm/runtime/java.cpp
hotspot/src/share/vm/runtime/java.hpp
hotspot/src/share/vm/runtime/thread.cpp
hotspot/src/share/vm/utilities/vmError.cpp
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp	Mon Oct 29 16:39:14 2012 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp	Thu Nov 01 13:05:47 2012 +0100
@@ -114,6 +114,7 @@
   /* Java runtime version access */                                                               \
   template(sun_misc_Version,                          "sun/misc/Version")                         \
   template(java_runtime_name_name,                    "java_runtime_name")                        \
+  template(java_runtime_version_name,                 "java_runtime_version")                     \
                                                                                                   \
   /* class file format tags */                                                                    \
   template(tag_source_file,                           "SourceFile")                               \
--- a/hotspot/src/share/vm/runtime/java.cpp	Mon Oct 29 16:39:14 2012 -0700
+++ b/hotspot/src/share/vm/runtime/java.cpp	Thu Nov 01 13:05:47 2012 +0100
@@ -688,6 +688,7 @@
 
 JDK_Version JDK_Version::_current;
 const char* JDK_Version::_runtime_name;
+const char* JDK_Version::_runtime_version;
 
 void JDK_Version::initialize() {
   jdk_version_info info;
--- a/hotspot/src/share/vm/runtime/java.hpp	Mon Oct 29 16:39:14 2012 -0700
+++ b/hotspot/src/share/vm/runtime/java.hpp	Thu Nov 01 13:05:47 2012 +0100
@@ -75,6 +75,7 @@
 
   static JDK_Version _current;
   static const char* _runtime_name;
+  static const char* _runtime_version;
 
   // 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
@@ -189,6 +190,13 @@
     _runtime_name = name;
   }
 
+  static const char* runtime_version() {
+    return _runtime_version;
+  }
+  static void set_runtime_version(const char* version) {
+    _runtime_version = version;
+  }
+
   // 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 Oct 29 16:39:14 2012 -0700
+++ b/hotspot/src/share/vm/runtime/thread.cpp	Thu Nov 01 13:05:47 2012 +0100
@@ -1042,6 +1042,7 @@
 }
 
 char java_runtime_name[128] = "";
+char java_runtime_version[128] = "";
 
 // extract the JRE name from sun.misc.Version.java_runtime_name
 static const char* get_java_runtime_name(TRAPS) {
@@ -1064,6 +1065,27 @@
   }
 }
 
+// extract the JRE version from sun.misc.Version.java_runtime_version
+static const char* get_java_runtime_version(TRAPS) {
+  Klass* 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_version_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_version,
+                                                        sizeof(java_runtime_version));
+    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) {
@@ -3473,6 +3495,7 @@
 
       // get the Java runtime name after java.lang.System is initialized
       JDK_Version::set_runtime_name(get_java_runtime_name(THREAD));
+      JDK_Version::set_runtime_version(get_java_runtime_version(THREAD));
     } else {
       warning("java.lang.System not initialized");
     }
--- a/hotspot/src/share/vm/utilities/vmError.cpp	Mon Oct 29 16:39:14 2012 -0700
+++ b/hotspot/src/share/vm/utilities/vmError.cpp	Thu Nov 01 13:05:47 2012 +0100
@@ -453,7 +453,9 @@
      JDK_Version::current().to_string(buf, sizeof(buf));
      const char* runtime_name = JDK_Version::runtime_name() != NULL ?
                                   JDK_Version::runtime_name() : "";
-     st->print_cr("# JRE version: %s (%s)", runtime_name, buf);
+     const char* runtime_version = JDK_Version::runtime_version() != NULL ?
+                                  JDK_Version::runtime_version() : "";
+     st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version);
      st->print_cr("# Java VM: %s (%s %s %s %s)",
                    Abstract_VM_Version::vm_name(),
                    Abstract_VM_Version::vm_release(),