vm_version.cpp revision 1010:354d3184f6b2
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 // 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      #else
194        #define HOTSPOT_BUILD_COMPILER "unknown Workshop:" XSTR(__SUNPRO_CC)
195      #endif
196    #elif defined(__GNUC__)
197        #define HOTSPOT_BUILD_COMPILER "gcc " __VERSION__
198    #else
199      #define HOTSPOT_BUILD_COMPILER "unknown compiler"
200    #endif
201  #endif
202
203
204  return VMNAME " (" VM_RELEASE ") for " OS "-" CPU
205         " JRE (" JRE_RELEASE_VERSION "), built on " __DATE__ " " __TIME__
206         " by " XSTR(HOTSPOT_BUILD_USER) " with " HOTSPOT_BUILD_COMPILER;
207}
208
209unsigned int Abstract_VM_Version::jvm_version() {
210  return ((Abstract_VM_Version::vm_major_version() & 0xFF) << 24) |
211         ((Abstract_VM_Version::vm_minor_version() & 0xFF) << 16) |
212         (Abstract_VM_Version::vm_build_number() & 0xFF);
213}
214
215
216void VM_Version_init() {
217  VM_Version::initialize();
218
219#ifndef PRODUCT
220  if (PrintMiscellaneous && Verbose) {
221    os::print_cpu_info(tty);
222  }
223#endif
224}
225
226unsigned int Abstract_VM_Version::nof_parallel_worker_threads(
227                                                      unsigned int num,
228                                                      unsigned int den,
229                                                      unsigned int switch_pt) {
230  if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
231    assert(ParallelGCThreads == 0, "Default ParallelGCThreads is not 0");
232    // For very large machines, there are diminishing returns
233    // for large numbers of worker threads.  Instead of
234    // hogging the whole system, use a fraction of the workers for every
235    // processor after the first 8.  For example, on a 72 cpu machine
236    // and a chosen fraction of 5/8
237    // use 8 + (72 - 8) * (5/8) == 48 worker threads.
238    unsigned int ncpus = (unsigned int) os::active_processor_count();
239    return (ncpus <= switch_pt) ?
240           ncpus :
241          (switch_pt + ((ncpus - switch_pt) * num) / den);
242  } else {
243    return ParallelGCThreads;
244  }
245}
246
247unsigned int Abstract_VM_Version::calc_parallel_worker_threads() {
248  return nof_parallel_worker_threads(5, 8, 8);
249}
250
251
252// Does not set the _initialized flag since it is
253// a global flag.
254unsigned int Abstract_VM_Version::parallel_worker_threads() {
255  if (!_parallel_worker_threads_initialized) {
256    if (FLAG_IS_DEFAULT(ParallelGCThreads)) {
257      _parallel_worker_threads = VM_Version::calc_parallel_worker_threads();
258    } else {
259      _parallel_worker_threads = ParallelGCThreads;
260    }
261    _parallel_worker_threads_initialized = true;
262  }
263  return _parallel_worker_threads;
264}
265