vm_version.cpp revision 1472:c18cbe5936b8
1/*
2 * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25# include "incls/_precompiled.incl"
26# include "incls/_vm_version.cpp.incl"
27
28const char* Abstract_VM_Version::_s_vm_release = Abstract_VM_Version::vm_release();
29const char* Abstract_VM_Version::_s_internal_vm_info_string = Abstract_VM_Version::internal_vm_info_string();
30bool Abstract_VM_Version::_supports_cx8 = false;
31unsigned int Abstract_VM_Version::_logical_processors_per_package = 1U;
32
33#ifndef HOTSPOT_RELEASE_VERSION
34  #error HOTSPOT_RELEASE_VERSION must be defined
35#endif
36#ifndef JRE_RELEASE_VERSION
37  #error JRE_RELEASE_VERSION must be defined
38#endif
39#ifndef HOTSPOT_BUILD_TARGET
40  #error HOTSPOT_BUILD_TARGET must be defined
41#endif
42
43#ifdef PRODUCT
44  #define VM_RELEASE HOTSPOT_RELEASE_VERSION
45#else
46  #define VM_RELEASE HOTSPOT_RELEASE_VERSION "-" HOTSPOT_BUILD_TARGET
47#endif
48
49// HOTSPOT_RELEASE_VERSION must follow the release version naming convention
50// <major_ver>.<minor_ver>-b<nn>[-<identifier>][-<debug_target>]
51int Abstract_VM_Version::_vm_major_version = 0;
52int Abstract_VM_Version::_vm_minor_version = 0;
53int Abstract_VM_Version::_vm_build_number = 0;
54bool Abstract_VM_Version::_initialized = false;
55int Abstract_VM_Version::_parallel_worker_threads = 0;
56bool Abstract_VM_Version::_parallel_worker_threads_initialized = false;
57
58void Abstract_VM_Version::initialize() {
59  if (_initialized) {
60    return;
61  }
62  char* vm_version = os::strdup(HOTSPOT_RELEASE_VERSION);
63
64  // Expecting the next vm_version format:
65  // <major_ver>.<minor_ver>-b<nn>[-<identifier>]
66  char* vm_major_ver = vm_version;
67  assert(isdigit(vm_major_ver[0]),"wrong vm major version number");
68  char* vm_minor_ver = strchr(vm_major_ver, '.');
69  assert(vm_minor_ver != NULL && isdigit(vm_minor_ver[1]),"wrong vm minor version number");
70  vm_minor_ver[0] = '\0'; // terminate vm_major_ver
71  vm_minor_ver += 1;
72  char* vm_build_num = strchr(vm_minor_ver, '-');
73  assert(vm_build_num != NULL && vm_build_num[1] == 'b' && isdigit(vm_build_num[2]),"wrong vm build number");
74  vm_build_num[0] = '\0'; // terminate vm_minor_ver
75  vm_build_num += 2;
76
77  _vm_major_version = atoi(vm_major_ver);
78  _vm_minor_version = atoi(vm_minor_ver);
79  _vm_build_number  = atoi(vm_build_num);
80
81  os::free(vm_version);
82  _initialized = true;
83}
84
85#if defined(_LP64)
86  #define VMLP "64-Bit "
87#else
88  #define VMLP ""
89#endif
90
91#ifdef KERNEL
92  #define VMTYPE "Kernel"
93#else // KERNEL
94#ifdef TIERED
95  #define VMTYPE "Server"
96#else // TIERED
97#ifdef ZERO
98  #define VMTYPE "Zero"
99#else // ZERO
100   #define VMTYPE COMPILER1_PRESENT("Client")   \
101                  COMPILER2_PRESENT("Server")
102#endif // ZERO
103#endif // TIERED
104#endif // KERNEL
105
106#ifndef HOTSPOT_VM_DISTRO
107  #error HOTSPOT_VM_DISTRO must be defined
108#endif
109#define VMNAME HOTSPOT_VM_DISTRO " " VMLP VMTYPE " VM"
110
111const char* Abstract_VM_Version::vm_name() {
112  return VMNAME;
113}
114
115
116const char* Abstract_VM_Version::vm_vendor() {
117#ifdef VENDOR
118  return XSTR(VENDOR);
119#else
120  return "Sun Microsystems Inc.";
121#endif
122}
123
124
125const char* Abstract_VM_Version::vm_info_string() {
126  switch (Arguments::mode()) {
127    case Arguments::_int:
128      return UseSharedSpaces ? "interpreted mode, sharing" : "interpreted mode";
129    case Arguments::_mixed:
130      return UseSharedSpaces ? "mixed mode, sharing"       :  "mixed mode";
131    case Arguments::_comp:
132      return UseSharedSpaces ? "compiled mode, sharing"    : "compiled mode";
133  };
134  ShouldNotReachHere();
135  return "";
136}
137
138// NOTE: do *not* use stringStream. this function is called by
139//       fatal error handler. if the crash is in native thread,
140//       stringStream cannot get resource allocated and will SEGV.
141const char* Abstract_VM_Version::vm_release() {
142  return VM_RELEASE;
143}
144
145#define OS       LINUX_ONLY("linux")             \
146                 WINDOWS_ONLY("windows")         \
147                 SOLARIS_ONLY("solaris")
148
149#ifdef ZERO
150#define CPU      ZERO_LIBARCH
151#else
152#define CPU      IA32_ONLY("x86")                \
153                 IA64_ONLY("ia64")               \
154                 AMD64_ONLY("amd64")             \
155                 SPARC_ONLY("sparc")
156#endif // ZERO
157
158const char *Abstract_VM_Version::vm_platform_string() {
159  return OS "-" CPU;
160}
161
162const char* Abstract_VM_Version::internal_vm_info_string() {
163  #ifndef HOTSPOT_BUILD_USER
164    #define HOTSPOT_BUILD_USER unknown
165  #endif
166
167  #ifndef HOTSPOT_BUILD_COMPILER
168    #ifdef _MSC_VER
169      #if   _MSC_VER == 1100
170        #define HOTSPOT_BUILD_COMPILER "MS VC++ 5.0"
171      #elif _MSC_VER == 1200
172        #define HOTSPOT_BUILD_COMPILER "MS VC++ 6.0"
173      #elif _MSC_VER == 1310
174        #define HOTSPOT_BUILD_COMPILER "MS VC++ 7.1 (VS2003)"
175      #elif _MSC_VER == 1400
176        #define HOTSPOT_BUILD_COMPILER "MS VC++ 8.0 (VS2005)"
177      #elif _MSC_VER == 1500
178        #define HOTSPOT_BUILD_COMPILER "MS VC++ 9.0 (VS2008)"
179      #else
180        #define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
181      #endif
182    #elif defined(__SUNPRO_CC)
183      #if   __SUNPRO_CC == 0x420
184        #define HOTSPOT_BUILD_COMPILER "Workshop 4.2"
185      #elif __SUNPRO_CC == 0x500
186        #define HOTSPOT_BUILD_COMPILER "Workshop 5.0 compat=" XSTR(__SUNPRO_CC_COMPAT)
187      #elif __SUNPRO_CC == 0x520
188        #define HOTSPOT_BUILD_COMPILER "Workshop 5.2 compat=" XSTR(__SUNPRO_CC_COMPAT)
189      #elif __SUNPRO_CC == 0x580
190        #define HOTSPOT_BUILD_COMPILER "Workshop 5.8"
191      #elif __SUNPRO_CC == 0x590
192        #define HOTSPOT_BUILD_COMPILER "Workshop 5.9"
193      #elif __SUNPRO_CC == 0x5100
194        #define HOTSPOT_BUILD_COMPILER "Sun Studio 12u1"
195      #else
196        #define HOTSPOT_BUILD_COMPILER "unknown Workshop:" XSTR(__SUNPRO_CC)
197      #endif
198    #elif defined(__GNUC__)
199        #define HOTSPOT_BUILD_COMPILER "gcc " __VERSION__
200    #else
201      #define HOTSPOT_BUILD_COMPILER "unknown compiler"
202    #endif
203  #endif
204
205
206  return VMNAME " (" VM_RELEASE ") for " OS "-" CPU
207         " JRE (" JRE_RELEASE_VERSION "), built on " __DATE__ " " __TIME__
208         " by " XSTR(HOTSPOT_BUILD_USER) " with " HOTSPOT_BUILD_COMPILER;
209}
210
211unsigned int Abstract_VM_Version::jvm_version() {
212  return ((Abstract_VM_Version::vm_major_version() & 0xFF) << 24) |
213         ((Abstract_VM_Version::vm_minor_version() & 0xFF) << 16) |
214         (Abstract_VM_Version::vm_build_number() & 0xFF);
215}
216
217
218void VM_Version_init() {
219  VM_Version::initialize();
220
221#ifndef PRODUCT
222  if (PrintMiscellaneous && Verbose) {
223    os::print_cpu_info(tty);
224  }
225#endif
226}
227
228unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
229                                                      unsigned int num,
230                                                      unsigned int den,
231                                                      unsigned int switch_pt) {
232  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
233    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
234    // For very large machines, there are diminishing returns
235    // for large numbers of worker threads.  Instead of
236    // hogging the whole system, use a fraction of the workers for every
237    // processor after the first 8.  For example, on a 72 cpu machine
238    // and a chosen fraction of 5/8
239    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
240    unsigned int ncpus = (unsigned int) os::active_processor_count();
241    return (ncpus <= switch_pt) ?
242           ncpus :
243          (switch_pt + ((ncpus - switch_pt) * num) / den);
244  } else {
245    return ParallelGCThreads;
246  }
247}
248
249unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
250  return nof_parallel_worker_threads(5, 8, 8);
251}
252
253
254// Does not set the _initialized flag since it is
255// a global flag.
256unsigned int Abstract_VM_Version::parallel_worker_threads() {
257  if (!_parallel_worker_threads_initialized) {
258    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
259      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
260    } else {
261      _parallel_worker_threads = ParallelGCThreads;
262    }
263    _parallel_worker_threads_initialized = true;
264  }
265  return _parallel_worker_threads;
266}
267