vm_version.cpp revision 844:bd02caa94611
1/*
2 * Copyright 1998-2009 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any 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
97  #define VMTYPE COMPILER1_PRESENT("Client")   \
98                 COMPILER2_PRESENT("Server")
99#endif // TIERED
100#endif // KERNEL
101
102#ifndef HOTSPOT_VM_DISTRO
103  #error HOTSPOT_VM_DISTRO must be defined
104#endif
105#define VMNAME HOTSPOT_VM_DISTRO " " VMLP VMTYPE " VM"
106
107const char* Abstract_VM_Version::vm_name() {
108  return VMNAME;
109}
110
111
112const char* Abstract_VM_Version::vm_vendor() {
113#ifdef VENDOR
114  return XSTR(VENDOR);
115#else
116  return "Sun Microsystems Inc.";
117#endif
118}
119
120
121const char* Abstract_VM_Version::vm_info_string() {
122  switch (Arguments::mode()) {
123    case Arguments::_int:
124      return UseSharedSpaces ? "interpreted mode, sharing" : "interpreted mode";
125    case Arguments::_mixed:
126      return UseSharedSpaces ? "mixed mode, sharing"       :  "mixed mode";
127    case Arguments::_comp:
128      return UseSharedSpaces ? "compiled mode, sharing"    : "compiled mode";
129  };
130  ShouldNotReachHere();
131  return "";
132}
133
134// NOTE: do *not* use stringStream. this function is called by
135//       fatal error handler. if the crash is in native thread,
136//       stringStream cannot get resource allocated and will SEGV.
137const char* Abstract_VM_Version::vm_release() {
138  return VM_RELEASE;
139}
140
141#define OS       LINUX_ONLY("linux")             \
142                 WINDOWS_ONLY("windows")         \
143                 SOLARIS_ONLY("solaris")
144
145#define CPU      IA32_ONLY("x86")                \
146                 IA64_ONLY("ia64")               \
147                 AMD64_ONLY("amd64")             \
148                 SPARC_ONLY("sparc")
149
150const char *Abstract_VM_Version::vm_platform_string() {
151  return OS "-" CPU;
152}
153
154const char* Abstract_VM_Version::internal_vm_info_string() {
155  #ifndef HOTSPOT_BUILD_USER
156    #define HOTSPOT_BUILD_USER unknown
157  #endif
158
159  #ifndef HOTSPOT_BUILD_COMPILER
160    #ifdef _MSC_VER
161      #if   _MSC_VER == 1100
162        #define HOTSPOT_BUILD_COMPILER "MS VC++ 5.0"
163      #elif _MSC_VER == 1200
164        #define HOTSPOT_BUILD_COMPILER "MS VC++ 6.0"
165      #elif _MSC_VER == 1310
166        #define HOTSPOT_BUILD_COMPILER "MS VC++ 7.1 (VS2003)"
167      #elif _MSC_VER == 1400
168        #define HOTSPOT_BUILD_COMPILER "MS VC++ 8.0 (VS2005)"
169      #elif _MSC_VER == 1500
170        #define HOTSPOT_BUILD_COMPILER "MS VC++ 9.0 (VS2008)"
171      #else
172        #define HOTSPOT_BUILD_COMPILER "unknown MS VC++:" XSTR(_MSC_VER)
173      #endif
174    #elif defined(__SUNPRO_CC)
175      #if   __SUNPRO_CC == 0x420
176        #define HOTSPOT_BUILD_COMPILER "Workshop 4.2"
177      #elif __SUNPRO_CC == 0x500
178        #define HOTSPOT_BUILD_COMPILER "Workshop 5.0 compat=" XSTR(__SUNPRO_CC_COMPAT)
179      #elif __SUNPRO_CC == 0x520
180        #define HOTSPOT_BUILD_COMPILER "Workshop 5.2 compat=" XSTR(__SUNPRO_CC_COMPAT)
181      #elif __SUNPRO_CC == 0x580
182        #define HOTSPOT_BUILD_COMPILER "Workshop 5.8"
183      #elif __SUNPRO_CC == 0x590
184        #define HOTSPOT_BUILD_COMPILER "Workshop 5.9"
185      #else
186        #define HOTSPOT_BUILD_COMPILER "unknown Workshop:" XSTR(__SUNPRO_CC)
187      #endif
188    #elif defined(__GNUC__)
189        #define HOTSPOT_BUILD_COMPILER "gcc " __VERSION__
190    #else
191      #define HOTSPOT_BUILD_COMPILER "unknown compiler"
192    #endif
193  #endif
194
195
196  return VMNAME " (" VM_RELEASE ") for " OS "-" CPU
197         " JRE (" JRE_RELEASE_VERSION "), built on " __DATE__ " " __TIME__
198         " by " XSTR(HOTSPOT_BUILD_USER) " with " HOTSPOT_BUILD_COMPILER;
199}
200
201unsigned int Abstract_VM_Version::jvm_version() {
202  return ((Abstract_VM_Version::vm_major_version() & 0xFF) << 24) |
203         ((Abstract_VM_Version::vm_minor_version() & 0xFF) << 16) |
204         (Abstract_VM_Version::vm_build_number() & 0xFF);
205}
206
207
208void VM_Version_init() {
209  VM_Version::initialize();
210
211#ifndef PRODUCT
212  if (PrintMiscellaneous && Verbose) {
213    os::print_cpu_info(tty);
214  }
215#endif
216}
217
218unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
219                                                      unsigned int num,
220                                                      unsigned int den,
221                                                      unsigned int switch_pt) {
222  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
223    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
224    // For very large machines, there are diminishing returns
225    // for large numbers of worker threads.  Instead of
226    // hogging the whole system, use a fraction of the workers for every
227    // processor after the first 8.  For example, on a 72 cpu machine
228    // and a chosen fraction of 5/8
229    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
230    unsigned int ncpus = (unsigned int) os::active_processor_count();
231    return (ncpus <= switch_pt) ?
232           ncpus :
233          (switch_pt + ((ncpus - switch_pt) * num) / den);
234  } else {
235    return ParallelGCThreads;
236  }
237}
238
239unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
240  return nof_parallel_worker_threads(5, 8, 8);
241}
242
243
244// Does not set the _initialized flag since it is
245// a global flag.
246unsigned int Abstract_VM_Version::parallel_worker_threads() {
247  if (!_parallel_worker_threads_initialized) {
248    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
249      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
250    } else {
251      _parallel_worker_threads = ParallelGCThreads;
252    }
253    _parallel_worker_threads_initialized = true;
254  }
255  return _parallel_worker_threads;
256}
257