annotate src/share/vm/runtime/java.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 126ea7725993
children d5d065957597
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1644
2a47bd84841f 6965184: possible races in make_not_entrant_or_zombie
never
parents: 1552
diff changeset
2 * Copyright (c) 1997, 2010, 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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_java.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 HS_DTRACE_PROBE_DECL(hotspot, vm__shutdown);
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Statistics printing (method invocation histogram)
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 GrowableArray<methodOop>* collected_invoked_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 void collect_invoked_methods(methodOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
37 if (m->invocation_count() + m->compiled_invocation_count() >= 1 ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 collected_invoked_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
39 }
a61af66fc99e Initial load
duke
parents:
diff changeset
40 }
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 GrowableArray<methodOop>* collected_profiled_methods;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 void collect_profiled_methods(methodOop m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 methodHandle mh(Thread::current(), m);
a61af66fc99e Initial load
duke
parents:
diff changeset
47 if ((m->method_data() != NULL) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
48 (PrintMethodData || CompilerOracle::should_print(mh))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 collected_profiled_methods->push(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
50 }
a61af66fc99e Initial load
duke
parents:
diff changeset
51 }
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 int compare_methods(methodOop* a, methodOop* b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // %%% there can be 32-bit overflow here
a61af66fc99e Initial load
duke
parents:
diff changeset
56 return ((*b)->invocation_count() + (*b)->compiled_invocation_count())
a61af66fc99e Initial load
duke
parents:
diff changeset
57 - ((*a)->invocation_count() + (*a)->compiled_invocation_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 void print_method_invocation_histogram() {
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 collected_invoked_methods = new GrowableArray<methodOop>(1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 SystemDictionary::methods_do(collect_invoked_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
66 collected_invoked_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 //
a61af66fc99e Initial load
duke
parents:
diff changeset
68 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
69 tty->print_cr("Histogram Over MethodOop Invocation Counters (cutoff = %d):", MethodHistogramCutoff);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
71 tty->print_cr("____Count_(I+C)____Method________________________Module_________________");
a61af66fc99e Initial load
duke
parents:
diff changeset
72 unsigned total = 0, int_total = 0, comp_total = 0, static_total = 0, final_total = 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
73 synch_total = 0, nativ_total = 0, acces_total = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 for (int index = 0; index < collected_invoked_methods->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 methodOop m = collected_invoked_methods->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 int c = m->invocation_count() + m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
77 if (c >= MethodHistogramCutoff) m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
78 int_total += m->invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 comp_total += m->compiled_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
80 if (m->is_final()) final_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if (m->is_static()) static_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
82 if (m->is_synchronized()) synch_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
83 if (m->is_native()) nativ_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if (m->is_accessor()) acces_total += c;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
87 total = int_total + comp_total;
a61af66fc99e Initial load
duke
parents:
diff changeset
88 tty->print_cr("Invocations summary:");
a61af66fc99e Initial load
duke
parents:
diff changeset
89 tty->print_cr("\t%9d (%4.1f%%) interpreted", int_total, 100.0 * int_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 tty->print_cr("\t%9d (%4.1f%%) compiled", comp_total, 100.0 * comp_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 tty->print_cr("\t%9d (100%%) total", total);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 tty->print_cr("\t%9d (%4.1f%%) synchronized", synch_total, 100.0 * synch_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 tty->print_cr("\t%9d (%4.1f%%) final", final_total, 100.0 * final_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 tty->print_cr("\t%9d (%4.1f%%) static", static_total, 100.0 * static_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 tty->print_cr("\t%9d (%4.1f%%) native", nativ_total, 100.0 * nativ_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 tty->print_cr("\t%9d (%4.1f%%) accessor", acces_total, 100.0 * acces_total / total);
a61af66fc99e Initial load
duke
parents:
diff changeset
97 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
98 SharedRuntime::print_call_statistics(comp_total);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 void print_method_profiling_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 collected_profiled_methods = new GrowableArray<methodOop>(1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 SystemDictionary::methods_do(collect_profiled_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
106 collected_profiled_methods->sort(&compare_methods);
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 int count = collected_profiled_methods->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (count > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 for (int index = 0; index < count; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 methodOop m = collected_profiled_methods->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
112 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
114 //m->print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 m->print_invocation_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 m->print_codes();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 tty->print_cr("------------------------------------------------------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void print_bytecode_count() {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 tty->print_cr("[BytecodeCounter::counter_value = %d]", BytecodeCounter::counter_value());
a61af66fc99e Initial load
duke
parents:
diff changeset
126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 AllocStats alloc_stats;
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // General statistics printing (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if (CountRuntimeCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 extern Histogram *RuntimeHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 RuntimeHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 }
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (CountJNICalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 extern Histogram *JNIHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 JNIHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (CountJVMCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 extern Histogram *JVMHistogram;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 JVMHistogram->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 if (MemProfiling) {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 MemProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
158 }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 #ifdef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
165 if ((PrintC1Statistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintC1Statistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
167 Runtime1::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
168 Deoptimization::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
169 nmethod::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #endif /* COMPILER1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
174 if ((PrintOptoStatistics || LogVMOutput || LogCompilation) && UseCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 FlagSetting fs(DisplayVMOutput, DisplayVMOutput && PrintOptoStatistics);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 Compile::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
177 #ifndef COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
178 Deoptimization::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 nmethod::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 #endif //COMPILER1
a61af66fc99e Initial load
duke
parents:
diff changeset
181 SharedRuntime::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
182 os::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
183 }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 if (PrintLockStatistics || PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (TimeLivenessAnalysis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 MethodLiveness::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
193 if (CollectIndexSetStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 IndexSet::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
197 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 print_method_invocation_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 if (ProfileInterpreter || Tier1UpdateMethodData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 print_method_profiling_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (TimeCompiler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 COMPILER2_PRESENT(Compile::print_timers();)
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (TimeCompilationPolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
208 CompilationPolicy::policy()->print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210 if (TimeOopMap) {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 GenerateOopMap::print_time();
a61af66fc99e Initial load
duke
parents:
diff changeset
212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 if (ProfilerCheckIntervals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 PeriodicTask::print_intervals();
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 if (PrintSymbolTableSizeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 SymbolTable::print_histogram();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 if (CountBytecodes || TraceBytecodes || StopInterpreterAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 BytecodeCounter::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (PrintBytecodePairHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 BytecodePairHistogram::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 (PrintCodeCache) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 CodeCache::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 if (PrintCodeCache2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 CodeCache::print_internals();
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 if (PrintClassStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 SystemDictionary::print_class_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 if (PrintMethodStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 SystemDictionary::print_method_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (PrintVtableStats) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 klassVtable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 klassItable::print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 if (VerifyOops) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 tty->print_cr("+VerifyOops count: %d", StubRoutines::verify_oop_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 print_bytecode_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 if (WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 tty->print("allocation stats: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
254 alloc_stats.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
255 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 if (PrintSystemDictionaryAtExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 SystemDictionary::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 #ifdef ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
268 if (ZapDeadCompiledLocals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 tty->print_cr("Compile::CompiledZap_count = %d", Compile::CompiledZap_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 tty->print_cr("OptoRuntime::ZapDeadCompiledLocals_count = %d", OptoRuntime::ZapDeadCompiledLocals_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
273 #endif // ENABLE_ZAP_DEAD_LOCALS
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 #else // PRODUCT MODE STATISTICS
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (CITime) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 CompileBroker::print_times();
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (PrintPreciseBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 OptoRuntime::print_named_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
288 if (PrintBiasedLockingStatistics) {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 BiasedLocking::print_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // Helper class for registering on_exit calls through JVM_OnExit
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
299 typedef void (*__exit_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 class ExitProc : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
303 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
304 __exit_proc _proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // void (*_proc)(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 ExitProc* _next;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 // ExitProc(void (*proc)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 ExitProc(__exit_proc proc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 _proc = proc;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 _next = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 }
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void evaluate() { _proc(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 ExitProc* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_next(ExitProc* next) { _next = next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 };
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Linked list of registered on_exit procedures
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 static ExitProc* exit_procs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
322
a61af66fc99e Initial load
duke
parents:
diff changeset
323
a61af66fc99e Initial load
duke
parents:
diff changeset
324 extern "C" {
a61af66fc99e Initial load
duke
parents:
diff changeset
325 void register_on_exit_function(void (*func)(void)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
326 ExitProc *entry = new ExitProc(func);
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // Classic vm does not throw an exception in case the allocation failed,
a61af66fc99e Initial load
duke
parents:
diff changeset
328 if (entry != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
329 entry->set_next(exit_procs);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 exit_procs = entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333 }
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // Note: before_exit() can be executed only once, if more than one threads
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // are trying to shutdown the VM at the same time, only one thread
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // can run before_exit() and all other threads must wait.
a61af66fc99e Initial load
duke
parents:
diff changeset
338 void before_exit(JavaThread * thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #define BEFORE_EXIT_NOT_RUN 0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 #define BEFORE_EXIT_RUNNING 1
a61af66fc99e Initial load
duke
parents:
diff changeset
341 #define BEFORE_EXIT_DONE 2
a61af66fc99e Initial load
duke
parents:
diff changeset
342 static jint volatile _before_exit_status = BEFORE_EXIT_NOT_RUN;
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // Note: don't use a Mutex to guard the entire before_exit(), as
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // JVMTI post_thread_end_event and post_vm_death_event will run native code.
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // A CAS or OSMutex would work just fine but then we need to manipulate
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // thread state for Safepoint. Here we use Monitor wait() and notify_all()
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // for synchronization.
a61af66fc99e Initial load
duke
parents:
diff changeset
349 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 switch (_before_exit_status) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 case BEFORE_EXIT_NOT_RUN:
a61af66fc99e Initial load
duke
parents:
diff changeset
352 _before_exit_status = BEFORE_EXIT_RUNNING;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 case BEFORE_EXIT_RUNNING:
a61af66fc99e Initial load
duke
parents:
diff changeset
355 while (_before_exit_status == BEFORE_EXIT_RUNNING) {
a61af66fc99e Initial load
duke
parents:
diff changeset
356 BeforeExit_lock->wait();
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358 assert(_before_exit_status == BEFORE_EXIT_DONE, "invalid state");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 case BEFORE_EXIT_DONE:
a61af66fc99e Initial load
duke
parents:
diff changeset
361 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 }
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365 // The only difference between this and Win32's _onexit procs is that
a61af66fc99e Initial load
duke
parents:
diff changeset
366 // this version is invoked before any threads get killed.
a61af66fc99e Initial load
duke
parents:
diff changeset
367 ExitProc* current = exit_procs;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 while (current != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
369 ExitProc* next = current->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
370 current->evaluate();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 delete current;
a61af66fc99e Initial load
duke
parents:
diff changeset
372 current = next;
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // Hang forever on exit if we're reporting an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (ShowMessageBoxOnError && is_error_reported()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 os::infinite_sleep();
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // Terminate watcher thread - must before disenrolling any periodic task
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
381 if (PeriodicTask::num_tasks() > 0)
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1644
diff changeset
382 WatcherThread::stop();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Print statistics gathered (profiling ...)
a61af66fc99e Initial load
duke
parents:
diff changeset
385 if (Arguments::has_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 FlatProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
387 FlatProfiler::print(10);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
389
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // shut down the StatSampler task
a61af66fc99e Initial load
duke
parents:
diff changeset
391 StatSampler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 StatSampler::destroy();
a61af66fc99e Initial load
duke
parents:
diff changeset
393
a61af66fc99e Initial load
duke
parents:
diff changeset
394 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // stop CMS threads
a61af66fc99e Initial load
duke
parents:
diff changeset
396 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 ConcurrentMarkSweepThread::stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // Print GC/heap related information.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 Universe::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 AdaptiveSizePolicyOutput(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (Arguments::has_alloc_profile()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Do one last collection to enumerate all the objects
a61af66fc99e Initial load
duke
parents:
diff changeset
411 // allocated since the last one.
a61af66fc99e Initial load
duke
parents:
diff changeset
412 Universe::heap()->collect(GCCause::_allocation_profiler);
a61af66fc99e Initial load
duke
parents:
diff changeset
413 AllocationProfiler::disengage();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 AllocationProfiler::print(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 if (PrintBytecodeHistogram) {
a61af66fc99e Initial load
duke
parents:
diff changeset
418 BytecodeHistogram::print();
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 if (JvmtiExport::should_post_thread_life()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
422 JvmtiExport::post_thread_end(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 // Always call even when there are not JVMTI environments yet, since environments
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // may be attached late and JVMTI must track phases of VM execution
a61af66fc99e Initial load
duke
parents:
diff changeset
426 JvmtiExport::post_vm_death();
a61af66fc99e Initial load
duke
parents:
diff changeset
427 Threads::shutdown_vm_agents();
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // Terminate the signal thread
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // Note: we don't wait until it actually dies.
a61af66fc99e Initial load
duke
parents:
diff changeset
431 os::terminate_signal_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
432
a61af66fc99e Initial load
duke
parents:
diff changeset
433 print_statistics();
a61af66fc99e Initial load
duke
parents:
diff changeset
434 Universe::heap()->print_tracing_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 { MutexLocker ml(BeforeExit_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
437 _before_exit_status = BEFORE_EXIT_DONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
438 BeforeExit_lock->notify_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 }
a61af66fc99e Initial load
duke
parents:
diff changeset
440
a61af66fc99e Initial load
duke
parents:
diff changeset
441 #undef BEFORE_EXIT_NOT_RUN
a61af66fc99e Initial load
duke
parents:
diff changeset
442 #undef BEFORE_EXIT_RUNNING
a61af66fc99e Initial load
duke
parents:
diff changeset
443 #undef BEFORE_EXIT_DONE
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446 void vm_exit(int code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
447 Thread* thread = ThreadLocalStorage::thread_index() == -1 ? NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
448 : ThreadLocalStorage::get_thread_slow();
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (thread == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // we have serious problems -- just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
451 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (VMThread::vm_thread() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Fire off a VM_Exit operation to bring VM to a safepoint and exit
a61af66fc99e Initial load
duke
parents:
diff changeset
456 VM_Exit op(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
457 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
458 ((JavaThread*)thread)->set_thread_state(_thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
459 VMThread::execute(&op);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // should never reach here; but in case something wrong with VM Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
461 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
462 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // VM thread is gone, just exit
a61af66fc99e Initial load
duke
parents:
diff changeset
464 vm_direct_exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 void notify_vm_shutdown() {
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // For now, just a dtrace probe.
a61af66fc99e Initial load
duke
parents:
diff changeset
471 HS_DTRACE_PROBE(hotspot, vm__shutdown);
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 242
diff changeset
472 HS_DTRACE_WORKAROUND_TAIL_CALL_BUG();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 void vm_direct_exit(int code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
477 ::exit(code);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 void vm_perform_shutdown_actions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Warning: do not call 'exit_globals()' here. All threads are still running.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // Calling 'exit_globals()' will disable thread-local-storage and cause all
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // kinds of assertions to trigger in debug mode.
a61af66fc99e Initial load
duke
parents:
diff changeset
484 if (is_init_completed()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
486 if (thread->is_Java_thread()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // We are leaving the VM, set state to native (in case any OS exit
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // handlers call back to the VM)
a61af66fc99e Initial load
duke
parents:
diff changeset
489 JavaThread* jt = (JavaThread*)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Must always be walkable or have no last_Java_frame when in
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // thread_in_native
a61af66fc99e Initial load
duke
parents:
diff changeset
492 jt->frame_anchor()->make_walkable(jt);
a61af66fc99e Initial load
duke
parents:
diff changeset
493 jt->set_thread_state(_thread_in_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496 notify_vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499 void vm_shutdown()
a61af66fc99e Initial load
duke
parents:
diff changeset
500 {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 vm_perform_shutdown_actions();
a61af66fc99e Initial load
duke
parents:
diff changeset
502 os::shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
505 void vm_abort(bool dump_core) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
506 vm_perform_shutdown_actions();
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
507 os::abort(dump_core);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
508 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511 void vm_notify_during_shutdown(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 if (error != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
514 tty->print("%s", error);
a61af66fc99e Initial load
duke
parents:
diff changeset
515 if (message != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
516 tty->print_cr(": %s", message);
a61af66fc99e Initial load
duke
parents:
diff changeset
517 }
a61af66fc99e Initial load
duke
parents:
diff changeset
518 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522 if (ShowMessageBoxOnError && WizardMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
523 fatal("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 void vm_exit_during_initialization(Handle exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 tty->print_cr("Error occurred during initialization of VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
529 // If there are exceptions on this thread it must be cleared
a61af66fc99e Initial load
duke
parents:
diff changeset
530 // first and here. Any future calls to EXCEPTION_MARK requires
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // that no pending exceptions exist.
a61af66fc99e Initial load
duke
parents:
diff changeset
532 Thread *THREAD = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
535 }
a61af66fc99e Initial load
duke
parents:
diff changeset
536 java_lang_Throwable::print(exception, tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
537 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
538 java_lang_Throwable::print_stack_trace(exception(), tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 vm_notify_during_shutdown(NULL, NULL);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
541
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
542 // 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
543 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 void vm_exit_during_initialization(symbolHandle ex, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
547 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 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
549
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
550 // 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
551 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void vm_exit_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
555 vm_notify_during_shutdown(error, message);
227
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
556
8d852b81e775 6694099: Hotspot vm_exit_out_of_memory should dump core
poonam
parents: 61
diff changeset
557 // 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
558 vm_abort(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void vm_shutdown_during_initialization(const char* error, const char* message) {
a61af66fc99e Initial load
duke
parents:
diff changeset
562 vm_notify_during_shutdown(error, message);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 vm_shutdown();
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
566 JDK_Version JDK_Version::_current;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 void JDK_Version::initialize() {
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
569 jdk_version_info info;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
570 assert(!_current.is_valid(), "Don't initialize twice");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
571
0
a61af66fc99e Initial load
duke
parents:
diff changeset
572 void *lib_handle = os::native_java_library();
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
573 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
574 os::dll_lookup(lib_handle, "JDK_GetVersionInfo0"));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 if (func == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // JDK older than 1.6
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
578 _current._partially_initialized = true;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
579 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
580 (*func)(&info, sizeof(info));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
581
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
582 int major = JDK_VERSION_MAJOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
583 int minor = JDK_VERSION_MINOR(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
584 int micro = JDK_VERSION_MICRO(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
585 int build = JDK_VERSION_BUILD(info.jdk_version);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
586 if (major == 1 && minor > 4) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
587 // 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
588 major = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
589 minor = micro;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
590 micro = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
591 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
592 _current = JDK_Version(major, minor, micro, info.update_version,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
593 info.special_update_version, build,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
594 info.thread_park_blocker == 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
595 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
596 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
597
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
598 void JDK_Version::fully_initialize(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
599 uint8_t major, uint8_t minor, uint8_t micro, uint8_t update) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
600 // 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
601 // far enough in the initialization to determine the exact version.
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
602 assert(major < 6, "not needed for JDK version >= 6");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
603 assert(is_partially_initialized(), "must not initialize");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
604 if (major < 5) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
605 // 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
606 micro = minor;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
607 minor = major;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
608 major = 1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
610 _current = JDK_Version(major, minor, micro, update);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 void JDK_Version_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
614 JDK_Version::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 }
242
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
616
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
617 static int64_t encode_jdk_version(const JDK_Version& v) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
618 return
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
619 ((int64_t)v.major_version() << (BitsPerByte * 5)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
620 ((int64_t)v.minor_version() << (BitsPerByte * 4)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
621 ((int64_t)v.micro_version() << (BitsPerByte * 3)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
622 ((int64_t)v.update_version() << (BitsPerByte * 2)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
623 ((int64_t)v.special_update_version() << (BitsPerByte * 1)) |
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
624 ((int64_t)v.build_number() << (BitsPerByte * 0));
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
625 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
626
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
627 int JDK_Version::compare(const JDK_Version& other) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
628 assert(is_valid() && other.is_valid(), "Invalid version (uninitialized?)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
629 if (!is_partially_initialized() && other.is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
630 return -(other.compare(*this)); // flip the comparators
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
631 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
632 assert(!other.is_partially_initialized(), "Not initialized yet");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
633 if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
634 assert(other.major_version() >= 6,
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
635 "Invalid JDK version comparison during initialization");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
636 return -1;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
637 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
638 uint64_t e = encode_jdk_version(*this);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
639 uint64_t o = encode_jdk_version(other);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
640 return (e > o) ? 1 : ((e == o) ? 0 : -1);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
641 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
642 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
643
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
644 void JDK_Version::to_string(char* buffer, size_t buflen) const {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
645 size_t index = 0;
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
646 if (!is_valid()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
647 jio_snprintf(buffer, buflen, "%s", "(uninitialized)");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
648 } else if (is_partially_initialized()) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
649 jio_snprintf(buffer, buflen, "%s", "(uninitialized) pre-1.6.0");
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
650 } else {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
651 index += jio_snprintf(
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
652 &buffer[index], buflen - index, "%d.%d", _major, _minor);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
653 if (_micro > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
654 index += jio_snprintf(&buffer[index], buflen - index, ".%d", _micro);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
655 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
656 if (_update > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
657 index += jio_snprintf(&buffer[index], buflen - index, "_%02d", _update);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
658 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
659 if (_special > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
660 index += jio_snprintf(&buffer[index], buflen - index, "%c", _special);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
661 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
662 if (_build > 0) {
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
663 index += jio_snprintf(&buffer[index], buflen - index, "-b%02d", _build);
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
664 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
665 }
d95b224e9f17 6721093: -XX:AppendRatio=N not supported
kamg
parents: 235
diff changeset
666 }