aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: */ aoqi@0: aoqi@0: #include "precompiled.hpp" aoqi@0: #include "classfile/symbolTable.hpp" aoqi@0: #include "code/icBuffer.hpp" aoqi@0: #include "gc_interface/collectedHeap.hpp" aoqi@0: #include "interpreter/bytecodes.hpp" aoqi@0: #include "memory/universe.hpp" aoqi@0: #include "prims/methodHandles.hpp" aoqi@0: #include "runtime/handles.inline.hpp" aoqi@0: #include "runtime/icache.hpp" aoqi@0: #include "runtime/init.hpp" aoqi@0: #include "runtime/safepoint.hpp" aoqi@0: #include "runtime/sharedRuntime.hpp" aoqi@0: #include "utilities/macros.hpp" aoqi@0: aoqi@0: // Initialization done by VM thread in vm_init_globals() aoqi@0: void check_ThreadShadow(); aoqi@0: void eventlog_init(); aoqi@0: void mutex_init(); aoqi@0: void chunkpool_init(); aoqi@0: void perfMemory_init(); aoqi@0: aoqi@0: // Initialization done by Java thread in init_globals() aoqi@0: void management_init(); aoqi@0: void bytecodes_init(); aoqi@0: void classLoader_init(); aoqi@0: void codeCache_init(); aoqi@0: void VM_Version_init(); aoqi@0: void os_init_globals(); // depends on VM_Version_init, before universe_init aoqi@0: void stubRoutines_init1(); aoqi@0: jint universe_init(); // depends on codeCache_init and stubRoutines_init aoqi@0: void interpreter_init(); // before any methods loaded aoqi@0: void invocationCounter_init(); // before any methods loaded aoqi@0: void marksweep_init(); aoqi@0: void accessFlags_init(); aoqi@0: void templateTable_init(); aoqi@0: void InterfaceSupport_init(); aoqi@0: void universe2_init(); // dependent on codeCache_init and stubRoutines_init, loads primordial classes aoqi@0: void referenceProcessor_init(); aoqi@0: void jni_handles_init(); aoqi@0: void vmStructs_init(); aoqi@0: aoqi@0: void vtableStubs_init(); aoqi@0: void InlineCacheBuffer_init(); aoqi@0: void compilerOracle_init(); aoqi@0: void compilationPolicy_init(); aoqi@0: void compileBroker_init(); aoqi@0: aoqi@0: // Initialization after compiler initialization aoqi@0: bool universe_post_init(); // must happen after compiler_init aoqi@0: void javaClasses_init(); // must happen after vtable initialization aoqi@0: void stubRoutines_init2(); // note: StubRoutines need 2-phase init aoqi@0: aoqi@0: // Do not disable thread-local-storage, as it is important for some aoqi@0: // JNI/JVM/JVMTI functions and signal handlers to work properly aoqi@0: // during VM shutdown aoqi@0: void perfMemory_exit(); aoqi@0: void ostream_exit(); aoqi@0: aoqi@0: void vm_init_globals() { aoqi@0: check_ThreadShadow(); aoqi@0: basic_types_init(); aoqi@0: eventlog_init(); aoqi@0: mutex_init(); aoqi@0: chunkpool_init(); aoqi@0: perfMemory_init(); aoqi@0: } aoqi@0: aoqi@0: aoqi@0: jint init_globals() { aoqi@0: HandleMark hm; aoqi@0: management_init(); aoqi@0: bytecodes_init(); aoqi@0: classLoader_init(); aoqi@0: codeCache_init(); aoqi@0: VM_Version_init(); aoqi@0: os_init_globals(); aoqi@0: stubRoutines_init1(); aoqi@0: jint status = universe_init(); // dependent on codeCache_init and aoqi@0: // stubRoutines_init1 and metaspace_init. aoqi@0: if (status != JNI_OK) aoqi@0: return status; aoqi@0: aoqi@0: interpreter_init(); // before any methods loaded aoqi@0: invocationCounter_init(); // before any methods loaded aoqi@0: marksweep_init(); aoqi@0: accessFlags_init(); aoqi@0: templateTable_init(); aoqi@0: InterfaceSupport_init(); aoqi@0: SharedRuntime::generate_stubs(); aoqi@0: universe2_init(); // dependent on codeCache_init and stubRoutines_init1 aoqi@0: referenceProcessor_init(); aoqi@0: jni_handles_init(); aoqi@0: #if INCLUDE_VM_STRUCTS aoqi@0: vmStructs_init(); aoqi@0: #endif // INCLUDE_VM_STRUCTS aoqi@0: aoqi@0: vtableStubs_init(); aoqi@0: InlineCacheBuffer_init(); aoqi@0: compilerOracle_init(); aoqi@0: compilationPolicy_init(); aoqi@0: compileBroker_init(); aoqi@0: VMRegImpl::set_regName(); aoqi@0: aoqi@0: if (!universe_post_init()) { aoqi@0: return JNI_ERR; aoqi@0: } aoqi@0: javaClasses_init(); // must happen after vtable initialization aoqi@0: stubRoutines_init2(); // note: StubRoutines need 2-phase init aoqi@0: aoqi@0: // All the flags that get adjusted by VM_Version_init and os::init_2 aoqi@0: // have been set so dump the flags now. aoqi@0: if (PrintFlagsFinal) { aoqi@0: CommandLineFlags::printFlags(tty, false); aoqi@0: } aoqi@0: aoqi@0: return JNI_OK; aoqi@0: } aoqi@0: aoqi@0: aoqi@0: void exit_globals() { aoqi@0: static bool destructorsCalled = false; aoqi@0: if (!destructorsCalled) { aoqi@0: destructorsCalled = true; aoqi@0: perfMemory_exit(); aoqi@0: if (PrintSafepointStatistics) { aoqi@0: // Print the collected safepoint statistics. aoqi@0: SafepointSynchronize::print_stat_on_exit(); aoqi@0: } aoqi@0: if (PrintStringTableStatistics) { aoqi@0: SymbolTable::dump(tty); aoqi@0: StringTable::dump(tty); aoqi@0: } aoqi@0: ostream_exit(); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: aoqi@0: static bool _init_completed = false; aoqi@0: aoqi@0: bool is_init_completed() { aoqi@0: return _init_completed; aoqi@0: } aoqi@0: aoqi@0: aoqi@0: void set_init_completed() { aoqi@0: assert(Universe::is_fully_initialized(), "Should have completed initialization"); aoqi@0: _init_completed = true; aoqi@0: }