src/share/vm/runtime/vm_version.cpp

Print this page
rev 6314 : 8030011: Update Hotspot version string output
Reviewed-by: dholmes, jcoomes, kvn

@@ -53,10 +53,24 @@
 int Abstract_VM_Version::_reserve_for_allocation_prefetch = 0;
 
 #ifndef HOTSPOT_RELEASE_VERSION
   #error HOTSPOT_RELEASE_VERSION must be defined
 #endif
+
+#ifndef JDK_MAJOR_VERSION
+  #error JDK_MAJOR_VERSION must be defined
+#endif
+#ifndef JDK_MINOR_VERSION
+  #error JDK_MINOR_VERSION must be defined
+#endif
+#ifndef JDK_MICRO_VERSION
+  #error JDK_MICRO_VERSION must be defined
+#endif
+#ifndef JDK_BUILD_NUMBER
+  #error JDK_BUILD_NUMBER must be defined
+#endif
+
 #ifndef JRE_RELEASE_VERSION
   #error JRE_RELEASE_VERSION must be defined
 #endif
 #ifndef HOTSPOT_BUILD_TARGET
   #error HOTSPOT_BUILD_TARGET must be defined

@@ -66,43 +80,47 @@
   #define VM_RELEASE HOTSPOT_RELEASE_VERSION
 #else
   #define VM_RELEASE HOTSPOT_RELEASE_VERSION "-" HOTSPOT_BUILD_TARGET
 #endif
 
-// HOTSPOT_RELEASE_VERSION must follow the release version naming convention
-// <major_ver>.<minor_ver>-b<nn>[-<identifier>][-<debug_target>]
+// HOTSPOT_RELEASE_VERSION follows the JDK release version naming convention
+// <major_ver>.<minor_ver>.<micro_ver>[-<identifier>][-<debug_target>][-b<nn>]
 int Abstract_VM_Version::_vm_major_version = 0;
 int Abstract_VM_Version::_vm_minor_version = 0;
+int Abstract_VM_Version::_vm_micro_version = 0;
 int Abstract_VM_Version::_vm_build_number = 0;
 bool Abstract_VM_Version::_initialized = false;
 int Abstract_VM_Version::_parallel_worker_threads = 0;
 bool Abstract_VM_Version::_parallel_worker_threads_initialized = false;
 
+#ifdef ASSERT
+static void assert_digits(const char * s, const char * message) {
+  for (int i = 0; s[i] != '\0'; i++) {
+    assert(isdigit(s[i]), message);
+  }
+}
+#endif
+
+static void set_version_field(int * version_field, const char * version_str,
+                              const char * const assert_msg) {
+  if (version_str != NULL && *version_str != '\0') {
+    DEBUG_ONLY(assert_digits(version_str, assert_msg));
+    *version_field = atoi(version_str);
+  }
+}
+
 void Abstract_VM_Version::initialize() {
   if (_initialized) {
     return;
   }
-  char* vm_version = os::strdup(HOTSPOT_RELEASE_VERSION);
 
-  // Expecting the next vm_version format:
-  // <major_ver>.<minor_ver>-b<nn>[-<identifier>]
-  char* vm_major_ver = vm_version;
-  assert(isdigit(vm_major_ver[0]),"wrong vm major version number");
-  char* vm_minor_ver = strchr(vm_major_ver, '.');
-  assert(vm_minor_ver != NULL && isdigit(vm_minor_ver[1]),"wrong vm minor version number");
-  vm_minor_ver[0] = '\0'; // terminate vm_major_ver
-  vm_minor_ver += 1;
-  char* vm_build_num = strchr(vm_minor_ver, '-');
-  assert(vm_build_num != NULL && vm_build_num[1] == 'b' && isdigit(vm_build_num[2]),"wrong vm build number");
-  vm_build_num[0] = '\0'; // terminate vm_minor_ver
-  vm_build_num += 2;
-
-  _vm_major_version = atoi(vm_major_ver);
-  _vm_minor_version = atoi(vm_minor_ver);
-  _vm_build_number  = atoi(vm_build_num);
+  set_version_field(&_vm_major_version, JDK_MAJOR_VERSION,  "wrong vm major version number");
+  set_version_field(&_vm_minor_version, JDK_MINOR_VERSION,  "wrong vm minor version number");
+  set_version_field(&_vm_micro_version, JDK_MICRO_VERSION,  "wrong vm micro version number");
+  int offset = (JDK_BUILD_NUMBER != NULL && JDK_BUILD_NUMBER[0] == 'b') ? 1 : 0;
+  set_version_field(&_vm_build_number, JDK_BUILD_NUMBER + offset, "bad build number");
 
-  os::free(vm_version);
   _initialized = true;
 }
 
 #if defined(_LP64)
   #define VMLP "64-Bit "

@@ -274,10 +292,11 @@
 }
 
 unsigned int Abstract_VM_Version::jvm_version() {
   return ((Abstract_VM_Version::vm_major_version() & 0xFF) << 24) |
          ((Abstract_VM_Version::vm_minor_version() & 0xFF) << 16) |
+         ((Abstract_VM_Version::vm_micro_version() & 0xFF) << 8) |
          (Abstract_VM_Version::vm_build_number() & 0xFF);
 }
 
 
 void VM_Version_init() {