Tue, 15 Mar 2011 06:35:10 -0700
7024234: 2/3 jvmti tests fail assert(!_oops_are_stale) failed: oops are stale on Win-AMD64
Summary: Move initialization of the '_instance' field to avoid race with ServiceThread start.
Reviewed-by: dholmes, kamg, never, dsamersoff, ysr, coleenp, acorn
1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #include "precompiled.hpp"
26 #include "code/icBuffer.hpp"
27 #include "gc_interface/collectedHeap.hpp"
28 #include "interpreter/bytecodes.hpp"
29 #include "memory/universe.hpp"
30 #include "prims/methodHandles.hpp"
31 #include "runtime/handles.inline.hpp"
32 #include "runtime/icache.hpp"
33 #include "runtime/init.hpp"
34 #include "runtime/safepoint.hpp"
35 #include "runtime/sharedRuntime.hpp"
37 // Initialization done by VM thread in vm_init_globals()
38 void check_ThreadShadow();
39 void eventlog_init();
40 void mutex_init();
41 void chunkpool_init();
42 void perfMemory_init();
44 // Initialization done by Java thread in init_globals()
45 void management_init();
46 void bytecodes_init();
47 void classLoader_init();
48 void codeCache_init();
49 void VM_Version_init();
50 void stubRoutines_init1();
51 jint universe_init(); // dependent on codeCache_init and stubRoutines_init
52 void interpreter_init(); // before any methods loaded
53 void invocationCounter_init(); // before any methods loaded
54 void marksweep_init();
55 void accessFlags_init();
56 void templateTable_init();
57 void InterfaceSupport_init();
58 void universe2_init(); // dependent on codeCache_init and stubRoutines_init
59 void referenceProcessor_init();
60 void jni_handles_init();
61 void vmStructs_init();
63 void vtableStubs_init();
64 void InlineCacheBuffer_init();
65 void compilerOracle_init();
66 void compilationPolicy_init();
69 // Initialization after compiler initialization
70 bool universe_post_init(); // must happen after compiler_init
71 void javaClasses_init(); // must happen after vtable initialization
72 void stubRoutines_init2(); // note: StubRoutines need 2-phase init
74 // Do not disable thread-local-storage, as it is important for some
75 // JNI/JVM/JVMTI functions and signal handlers to work properly
76 // during VM shutdown
77 void perfMemory_exit();
78 void ostream_exit();
80 void vm_init_globals() {
81 check_ThreadShadow();
82 basic_types_init();
83 eventlog_init();
84 mutex_init();
85 chunkpool_init();
86 perfMemory_init();
87 }
90 jint init_globals() {
91 HandleMark hm;
92 management_init();
93 bytecodes_init();
94 classLoader_init();
95 codeCache_init();
96 VM_Version_init();
97 stubRoutines_init1();
98 jint status = universe_init(); // dependent on codeCache_init and stubRoutines_init
99 if (status != JNI_OK)
100 return status;
102 interpreter_init(); // before any methods loaded
103 invocationCounter_init(); // before any methods loaded
104 marksweep_init();
105 accessFlags_init();
106 templateTable_init();
107 InterfaceSupport_init();
108 SharedRuntime::generate_stubs();
109 universe2_init(); // dependent on codeCache_init and stubRoutines_init
110 referenceProcessor_init();
111 jni_handles_init();
112 #ifndef VM_STRUCTS_KERNEL
113 vmStructs_init();
114 #endif // VM_STRUCTS_KERNEL
116 vtableStubs_init();
117 InlineCacheBuffer_init();
118 compilerOracle_init();
119 compilationPolicy_init();
120 VMRegImpl::set_regName();
122 if (!universe_post_init()) {
123 return JNI_ERR;
124 }
125 javaClasses_init(); // must happen after vtable initialization
126 stubRoutines_init2(); // note: StubRoutines need 2-phase init
128 // Although we'd like to, we can't easily do a heap verify
129 // here because the main thread isn't yet a JavaThread, so
130 // its TLAB may not be made parseable from the usual interfaces.
131 if (VerifyBeforeGC && !UseTLAB &&
132 Universe::heap()->total_collections() >= VerifyGCStartAt) {
133 Universe::heap()->prepare_for_verify();
134 Universe::verify(); // make sure we're starting with a clean slate
135 }
137 // All the flags that get adjusted by VM_Version_init and os::init_2
138 // have been set so dump the flags now.
139 if (PrintFlagsFinal) {
140 CommandLineFlags::printFlags();
141 }
143 return JNI_OK;
144 }
147 void exit_globals() {
148 static bool destructorsCalled = false;
149 if (!destructorsCalled) {
150 destructorsCalled = true;
151 perfMemory_exit();
152 if (PrintSafepointStatistics) {
153 // Print the collected safepoint statistics.
154 SafepointSynchronize::print_stat_on_exit();
155 }
156 ostream_exit();
157 }
158 }
161 static bool _init_completed = false;
163 bool is_init_completed() {
164 return _init_completed;
165 }
168 void set_init_completed() {
169 assert(Universe::is_fully_initialized(), "Should have completed initialization");
170 _init_completed = true;
171 }