annotate src/share/vm/runtime/java.cpp @ 3917:eca1193ca245

4965777: GC changes to support use of discovered field for pending references Summary: If and when the reference handler thread is able to use the discovered field to link reference objects in its pending list, so will GC. In that case, GC will scan through this field once a reference object has been placed on the pending list, but not scan that field before that stage, as the field is used by the concurrent GC thread to link discovered objects. When ReferenceHandleR thread does not use the discovered field for the purpose of linking the elements in the pending list, as would be the case in older JDKs, the JVM will fall back to the old behaviour of using the next field for that purpose. Reviewed-by: jcoomes, mchung, stefank
author ysr
date Wed, 07 Sep 2011 13:55:42 -0700
parents 0f34fdee809e
children f08d439fab8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2096
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
26 #include "classfile/classLoader.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
27 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
28 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
29 #include "code/codeCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
30 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
31 #include "compiler/compilerOracle.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
32 #include "interpreter/bytecodeHistogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
33 #include "memory/genCollectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
34 #include "memory/oopFactory.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
35 #include "memory/universe.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
36 #include "oops/constantPoolOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
37 #include "oops/generateOopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
38 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
39 #include "oops/instanceKlassKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
40 #include "oops/instanceOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
41 #include "oops/methodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
42 #include "oops/objArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
43 #include "oops/oop.inline.hpp"
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
44 #include "oops/symbol.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
45 #include "prims/jvmtiExport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
46 #include "runtime/aprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
47 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
48 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
49 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
50 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
51 #include "runtime/init.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
52 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
53 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
54 #include "runtime/memprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
55 #include "runtime/sharedRuntime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
56 #include "runtime/statSampler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
57 #include "runtime/task.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
58 #include "runtime/timer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
59 #include "runtime/vm_operations.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
60 #include "utilities/dtrace.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
61 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
62 #include "utilities/histogram.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
63 #include "utilities/vmError.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
64 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
65 # include "vm_version_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
66 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
67 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
68 # include "vm_version_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
69 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
70 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
71 # include "vm_version_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
72 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
73 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
74 # include "vm_version_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
75 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
76 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
77 # include "vm_version_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2177
diff changeset
78 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
79 #ifdef TARGET_OS_FAMILY_linux
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
80 # include "thread_linux.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
81 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
82 #ifdef TARGET_OS_FAMILY_solaris
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
83 # include "thread_solaris.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
84 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
85 #ifdef TARGET_OS_FAMILY_windows
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
86 # include "thread_windows.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
87 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
88 #ifndef SERIALGC
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
89 #include "gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
90 #include "gc_implementation/parallelScavenge/psScavenge.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
91 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
92 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
93 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
94 #include "c1/c1_Compiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
95 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
96 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
97 #ifdef COMPILER2
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
98 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
99 #include "compiler/methodLiveness.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
100 #include "opto/compile.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
101 #include "opto/indexSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
102 #include "opto/runtime.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1918
diff changeset
103 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 HS_DTRACE_PROBE_DECL(hotspot, vm__shutdown);
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Statistics printing (method invocation histogram)
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 GrowableArray<methodOop>* collected_invoked_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void collect_invoked_methods(methodOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 collected_invoked_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 GrowableArray<methodOop>* collected_profiled_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void collect_profiled_methods(methodOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 methodHandle mh(Thread::current(), m);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if ((m->method_data() != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
125 (PrintMethodData || CompilerOracle::should_print(mh))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 collected_profiled_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 int compare_methods(methodOop* a, methodOop* b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // %%% there can be 32-bit overflow here
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return ((*b)->invocation_count() + (*b)->compiled_invocation_count())
a61af66fc99e Initial load
duke
parents:
diff changeset
134 - ((*a)->invocation_count() + (*a)->compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
135 }
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 void print_method_invocation_histogram() {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 collected_invoked_methods = new GrowableArray<methodOop>(1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
142 SystemDictionary::methods_do(collect_invoked_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 collected_invoked_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 //
a61af66fc99e Initial load
duke
parents:
diff changeset
145 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
148 tty->print_cr("____Count_(I+C)____Method________________________Module_________________");
a61af66fc99e Initial load
duke
parents:
diff changeset
149 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
150 synch_total = 0, nativ_total = 0, acces_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 for (int index = 0; index < collected_invoked_methods->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 methodOop m = collected_invoked_methods->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 int c = m->invocation_count() + m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 if (c >= MethodHistogramCutoff) m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
155 int_total += m->invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
156 comp_total += m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (m->is_final()) final_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if (m->is_static()) static_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 if (m->is_synchronized()) synch_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 if (m->is_native()) nativ_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 if (m->is_accessor()) acces_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
164 total = int_total + comp_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 tty->print_cr("Invocations summary:");
a61af66fc99e Initial load
duke
parents:
diff changeset
166 tty->print_cr("\t%9d (%4.1f%%) interpreted", int_total, 100.0 * int_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 tty->print_cr("\t%9d (%4.1f%%) compiled", comp_total, 100.0 * comp_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 tty->print_cr("\t%9d (100%%) total", total);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 tty->print_cr("\t%9d (%4.1f%%) synchronized", synch_total, 100.0 * synch_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
170 tty->print_cr("\t%9d (%4.1f%%) final", final_total, 100.0 * final_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 tty->print_cr("\t%9d (%4.1f%%) static", static_total, 100.0 * static_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
172 tty->print_cr("\t%9d (%4.1f%%) native", nativ_total, 100.0 * nativ_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 tty->print_cr("\t%9d (%4.1f%%) accessor", acces_total, 100.0 * acces_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
175 SharedRuntime::print_call_statistics(comp_total);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void print_method_profiling_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 collected_profiled_methods = new GrowableArray<methodOop>(1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 SystemDictionary::methods_do(collect_profiled_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
183 collected_profiled_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int count = collected_profiled_methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 for (int index = 0; index < count; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 methodOop m = collected_profiled_methods->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
190 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
191 //m->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
193 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 m->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 void print_bytecode_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 tty->print_cr("[BytecodeCounter::counter_value = %d]", BytecodeCounter::counter_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 AllocStats alloc_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // General statistics printing (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 if (CountRuntimeCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 extern Histogram *RuntimeHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 RuntimeHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (CountJNICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 extern Histogram *JNIHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 JNIHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 if (CountJVMCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 extern Histogram *JVMHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
228 JVMHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (MemProfiling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 MemProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
242 if ((PrintC1Statistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintC1Statistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 Runtime1::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 Deoptimization::print_statistics();
3841
0f34fdee809e 7071427: AdapterFingerPrint can hold 8 entries per int
never
parents: 3769
diff changeset
246 SharedRuntime::print_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
247 nmethod::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 #endif /* COMPILER1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if ((PrintOptoStatistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintOptoStatistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
254 Compile::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 #ifndef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
256 Deoptimization::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
257 nmethod::print_statistics();
3841
0f34fdee809e 7071427: AdapterFingerPrint can hold 8 entries per int
never
parents: 3769
diff changeset
258 SharedRuntime::print_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259 #endif //COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
260 os::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 MethodLiveness::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
271 if (CollectIndexSetStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 IndexSet::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
275 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
276 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 print_method_invocation_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
1918
34bd82eba3bb 6997456: Not possible to build just compiler2
iveresov
parents: 1783
diff changeset
279 if (ProfileInterpreter COMPILER1_PRESENT(|| C1UpdateMethodData)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
280 print_method_profiling_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 if (TimeCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 COMPILER2_PRESENT(Compile::print_timers();)
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 if (TimeCompilationPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 CompilationPolicy::policy()->print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 if (TimeOopMap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 GenerateOopMap::print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (ProfilerCheckIntervals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 PeriodicTask::print_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (PrintSymbolTableSizeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 SymbolTable::print_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
298 BytecodeCounter::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if (PrintBytecodePairHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 BytecodePairHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 if (PrintCodeCache) {
a61af66fc99e Initial load
duke
parents:
diff changeset
305 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 CodeCache::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 if (PrintCodeCache2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 CodeCache::print_internals();
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (PrintClassStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 SystemDictionary::print_class_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
316 }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (PrintMethodStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
318 SystemDictionary::print_method_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 if (PrintVtableStats) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 klassVtable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
323 klassItable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325 if (VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 tty->print_cr("+VerifyOops count: %d", StubRoutines::verify_oop_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
327 }
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 print_bytecode_count();
2250
f7de3327c683 7017124: Fix some VM stats to avoid 32-bit overflow
kvn
parents: 2177
diff changeset
330 if (PrintMallocStatistics) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
331 tty->print("allocation stats: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
332 alloc_stats.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
333 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
334 }
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (PrintSystemDictionaryAtExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
345 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
346 if (ZapDeadCompiledLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 tty->print_cr("Compile::CompiledZap_count = %d", Compile::CompiledZap_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 tty->print_cr("OptoRuntime::ZapDeadCompiledLocals_count = %d", OptoRuntime::ZapDeadCompiledLocals_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 }
a61af66fc99e Initial load
duke
parents:
diff changeset
350 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
351 #endif // ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
352 }
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 #else // PRODUCT MODE STATISTICS
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
357
a61af66fc99e Initial load
duke
parents:
diff changeset
358 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
364 }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
366 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // Helper class for registering on_exit calls through JVM_OnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
375
a61af66fc99e Initial load
duke
parents:
diff changeset
376 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 typedef void (*__exit_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 class ExitProc : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
382 __exit_proc _proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 // void (*_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
384 ExitProc* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
385 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // ExitProc(void (*proc)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 ExitProc(__exit_proc proc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
388 _proc = proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 void evaluate() { _proc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 ExitProc* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
393 void set_next(ExitProc* next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 };
a61af66fc99e Initial load
duke
parents:
diff changeset
395
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Linked list of registered on_exit procedures
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 static ExitProc* exit_procs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 void register_on_exit_function(void (*func)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 ExitProc *entry = new ExitProc(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Classic vm does not throw an exception in case the allocation failed,
a61af66fc99e Initial load
duke
parents:
diff changeset
406 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 entry->set_next(exit_procs);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 exit_procs = entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
409 }
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Note: before_exit() can be executed only once, if more than one threads
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // are trying to shutdown the VM at the same time, only one thread
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // can run before_exit() and all other threads must wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 void before_exit(JavaThread * thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 #define BEFORE_EXIT_NOT_RUN 0
a61af66fc99e Initial load
duke
parents:
diff changeset
418 #define BEFORE_EXIT_RUNNING 1
a61af66fc99e Initial load
duke
parents:
diff changeset
419 #define BEFORE_EXIT_DONE 2
a61af66fc99e Initial load
duke
parents:
diff changeset
420 static jint volatile _before_exit_status = BEFORE_EXIT_NOT_RUN;
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Note: don't use a Mutex to guard the entire before_exit(), as
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // JVMTI post_thread_end_event and post_vm_death_event will run native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // A CAS or OSMutex would work just fine but then we need to manipulate
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // thread state for Safepoint. Here we use Monitor wait() and notify_all()
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // for synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
427 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
428 switch (_before_exit_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 case BEFORE_EXIT_NOT_RUN:
a61af66fc99e Initial load
duke
parents:
diff changeset
430 _before_exit_status = BEFORE_EXIT_RUNNING;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
432 case BEFORE_EXIT_RUNNING:
a61af66fc99e Initial load
duke
parents:
diff changeset
433 while (_before_exit_status == BEFORE_EXIT_RUNNING) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 BeforeExit_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
436 assert(_before_exit_status == BEFORE_EXIT_DONE, "invalid state");
a61af66fc99e Initial load
duke
parents:
diff changeset
437 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 case BEFORE_EXIT_DONE:
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // The only difference between this and Win32's _onexit procs is that
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // this version is invoked before any threads get killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
445 ExitProc* current = exit_procs;
a61af66fc99e Initial load
duke
parents:
diff changeset
446 while (current != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 ExitProc* next = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
448 current->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
449 delete current;
a61af66fc99e Initial load
duke
parents:
diff changeset
450 current = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 // Hang forever on exit if we're reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // Terminate watcher thread - must before disenrolling any periodic task
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
459 if (PeriodicTask::num_tasks() > 0)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
460 WatcherThread::stop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 // Print statistics gathered (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
463 if (Arguments::has_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 FlatProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
465 FlatProfiler::print(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // shut down the StatSampler task
a61af66fc99e Initial load
duke
parents:
diff changeset
469 StatSampler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
470 StatSampler::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
471
3769
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
472 // We do not need to explicitly stop concurrent GC threads because the
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
473 // JVM will be taken down at a safepoint when such threads are inactive --
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
474 // except for some concurrent G1 threads, see (comment in)
ef2d1b8f2dd4 7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents: 2304
diff changeset
475 // Threads::destroy_vm().
0
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 // Print GC/heap related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
479 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
480 AdaptiveSizePolicyOutput(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 }
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483
a61af66fc99e Initial load
duke
parents:
diff changeset
484 if (Arguments::has_alloc_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // Do one last collection to enumerate all the objects
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // allocated since the last one.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 Universe::heap()->collect(GCCause::_allocation_profiler);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 AllocationProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
490 AllocationProfiler::print(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
491 }
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (PrintBytecodeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 BytecodeHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
498 JvmtiExport::post_thread_end(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
499 }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
501 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
502 JvmtiExport::post_vm_death();
a61af66fc99e Initial load
duke
parents:
diff changeset
503 Threads::shutdown_vm_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 // Terminate the signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
506 // Note: we don't wait until it actually dies.
a61af66fc99e Initial load
duke
parents:
diff changeset
507 os::terminate_signal_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 Universe::heap()->print_tracing_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 _before_exit_status = BEFORE_EXIT_DONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 BeforeExit_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516
a61af66fc99e Initial load
duke
parents:
diff changeset
517 #undef BEFORE_EXIT_NOT_RUN
a61af66fc99e Initial load
duke
parents:
diff changeset
518 #undef BEFORE_EXIT_RUNNING
a61af66fc99e Initial load
duke
parents:
diff changeset
519 #undef BEFORE_EXIT_DONE
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 void vm_exit(int code) {
2096
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
523 Thread* thread = ThreadLocalStorage::is_initialized() ?
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
524 ThreadLocalStorage::get_thread_slow() : NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
525 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
526 // we have serious problems -- just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
527 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 if (VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Fire off a VM_Exit operation to bring VM to a safepoint and exit
a61af66fc99e Initial load
duke
parents:
diff changeset
532 VM_Exit op(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
534 ((JavaThread*)thread)->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // should never reach here; but in case something wrong with VM Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
537 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
538 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // VM thread is gone, just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
540 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
543 }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 void notify_vm_shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // For now, just a dtrace probe.
a61af66fc99e Initial load
duke
parents:
diff changeset
547 HS_DTRACE_PROBE(hotspot, vm__shutdown);
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 242
diff changeset
548 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
550
a61af66fc99e Initial load
duke
parents:
diff changeset
551 void vm_direct_exit(int code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 notify_vm_shutdown();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
553 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
554 ::exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void vm_perform_shutdown_actions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Warning: do not call 'exit_globals()' here. All threads are still running.
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Calling 'exit_globals()' will disable thread-local-storage and cause all
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // kinds of assertions to trigger in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
561 if (is_init_completed()) {
2096
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
562 Thread* thread = ThreadLocalStorage::is_initialized() ?
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
563 ThreadLocalStorage::get_thread_slow() : NULL;
0eb90baf1b69 6583275: Hotspot crash in vm_perform_shutdown_actions due to uninitialized TLS during out of memory handling
coleenp
parents: 1972
diff changeset
564 if (thread != NULL && thread->is_Java_thread()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 // We are leaving the VM, set state to native (in case any OS exit
a61af66fc99e Initial load
duke
parents:
diff changeset
566 // handlers call back to the VM)
a61af66fc99e Initial load
duke
parents:
diff changeset
567 JavaThread* jt = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 // Must always be walkable or have no last_Java_frame when in
a61af66fc99e Initial load
duke
parents:
diff changeset
569 // thread_in_native
a61af66fc99e Initial load
duke
parents:
diff changeset
570 jt->frame_anchor()->make_walkable(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
571 jt->set_thread_state(_thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
573 }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void vm_shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
578 {
a61af66fc99e Initial load
duke
parents:
diff changeset
579 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
580 os::wait_for_keypress_at_exit();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
584 void vm_abort(bool dump_core) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
585 vm_perform_shutdown_actions();
2302
da091bb67459 7022037: Pause when exiting if debugger is attached on windows
sla
parents: 2192
diff changeset
586 os::wait_for_keypress_at_exit();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
587 os::abort(dump_core);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
588 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 void vm_notify_during_shutdown(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 if (error != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
594 tty->print("%s", error);
a61af66fc99e Initial load
duke
parents:
diff changeset
595 if (message != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
596 tty->print_cr(": %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (ShowMessageBoxOnError && WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 fatal("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607 void vm_exit_during_initialization(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
609 // If there are exceptions on this thread it must be cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // first and here. Any future calls to EXCEPTION_MARK requires
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // that no pending exceptions exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
612 Thread *THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
613 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
616 java_lang_Throwable::print(exception, tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
618 java_lang_Throwable::print_stack_trace(exception(), tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
619 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
620 vm_notify_during_shutdown(NULL, NULL);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
621
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
622 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
623 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
624 }
a61af66fc99e Initial load
duke
parents:
diff changeset
625
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2129
diff changeset
626 void vm_exit_during_initialization(Symbol* ex, const char* message) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
628 vm_notify_during_shutdown(ex->as_C_string(), message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
629
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
630 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
631 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 void vm_exit_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 vm_notify_during_shutdown(error, message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
636
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
637 // Failure during initialization, we don't want to dump core
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
638 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 void vm_shutdown_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 vm_notify_during_shutdown(error, message);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
644 }
a61af66fc99e Initial load
duke
parents:
diff changeset
645
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
646 JDK_Version JDK_Version::_current;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 void JDK_Version::initialize() {
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
649 jdk_version_info info;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
650 assert(!_current.is_valid(), "Don't initialize twice");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
651
0
a61af66fc99e Initial load
duke
parents:
diff changeset
652 void *lib_handle = os::native_java_library();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
653 jdk_version_info_fn_t func = CAST_TO_FN_PTR(jdk_version_info_fn_t,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
654 os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 if (func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // JDK older than 1.6
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
658 _current._partially_initialized = true;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
659 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
660 (*func)(&info, sizeof(info));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
661
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
662 int major = JDK_VERSION_MAJOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
663 int minor = JDK_VERSION_MINOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
664 int micro = JDK_VERSION_MICRO(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
665 int build = JDK_VERSION_BUILD(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
666 if (major == 1 && minor > 4) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
667 // We represent "1.5.0" as "5.0", but 1.4.2 as itself.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
668 major = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
669 minor = micro;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
670 micro = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
671 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
672 _current = JDK_Version(major, minor, micro, info.update_version,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
673 info.special_update_version, build,
2129
8f8dfba37802 6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents: 2096
diff changeset
674 info.thread_park_blocker == 1,
3917
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3841
diff changeset
675 info.post_vm_init_hook_enabled == 1,
eca1193ca245 4965777: GC changes to support use of discovered field for pending references
ysr
parents: 3841
diff changeset
676 info.pending_list_uses_discovered_field == 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
678 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
679
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
680 void JDK_Version::fully_initialize(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
681 uint8_t major, uint8_t minor, uint8_t micro, uint8_t update) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
682 // This is only called when current is less than 1.6 and we've gotten
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
683 // far enough in the initialization to determine the exact version.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
684 assert(major < 6, "not needed for JDK version >= 6");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
685 assert(is_partially_initialized(), "must not initialize");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
686 if (major < 5) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
687 // JDK verison sequence: 1.2.x, 1.3.x, 1.4.x, 5.0.x, 6.0.x, etc.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
688 micro = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
689 minor = major;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
690 major = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
692 _current = JDK_Version(major, minor, micro, update);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
693 }
a61af66fc99e Initial load
duke
parents:
diff changeset
694
a61af66fc99e Initial load
duke
parents:
diff changeset
695 void JDK_Version_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
696 JDK_Version::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
698
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
699 static int64_t encode_jdk_version(const JDK_Version& v) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
700 return
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
701 ((int64_t)v.major_version() << (BitsPerByte * 5)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
702 ((int64_t)v.minor_version() << (BitsPerByte * 4)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
703 ((int64_t)v.micro_version() << (BitsPerByte * 3)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
704 ((int64_t)v.update_version() << (BitsPerByte * 2)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
705 ((int64_t)v.special_update_version() << (BitsPerByte * 1)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
706 ((int64_t)v.build_number() << (BitsPerByte * 0));
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
707 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
708
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
709 int JDK_Version::compare(const JDK_Version& other) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
710 assert(is_valid() && other.is_valid(), "Invalid version (uninitialized?)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
711 if (!is_partially_initialized() && other.is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
712 return -(other.compare(*this)); // flip the comparators
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
713 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
714 assert(!other.is_partially_initialized(), "Not initialized yet");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
715 if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
716 assert(other.major_version() >= 6,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
717 "Invalid JDK version comparison during initialization");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
718 return -1;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
719 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
720 uint64_t e = encode_jdk_version(*this);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
721 uint64_t o = encode_jdk_version(other);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
722 return (e > o) ? 1 : ((e == o) ? 0 : -1);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
723 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
724 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
725
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
726 void JDK_Version::to_string(char* buffer, size_t buflen) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
727 size_t index = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
728 if (!is_valid()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
729 jio_snprintf(buffer, buflen, "%s", "(uninitialized)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
730 } else if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
731 jio_snprintf(buffer, buflen, "%s", "(uninitialized) pre-1.6.0");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
732 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
733 index += jio_snprintf(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
734 &buffer[index], buflen - index, "%d.%d", _major, _minor);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
735 if (_micro > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
736 index += jio_snprintf(&buffer[index], buflen - index, ".%d", _micro);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
737 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
738 if (_update > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
739 index += jio_snprintf(&buffer[index], buflen - index, "_%02d", _update);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
740 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
741 if (_special > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
742 index += jio_snprintf(&buffer[index], buflen - index, "%c", _special);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
743 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
744 if (_build > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
745 index += jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
746 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
747 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
748 }