       1 /*
       2  * Copyright (c) 1997, 2014, 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  */
      24
      25 #include "precompiled.hpp"
      26 #include "classfile/symbolTable.hpp"
      27 #include "code/icBuffer.hpp"
      28 #include "gc_interface/collectedHeap.hpp"
      29 #include "interpreter/bytecodes.hpp"
      30 #include "memory/universe.hpp"
      31 #include "prims/methodHandles.hpp"
      32 #include "runtime/handles.inline.hpp"
      33 #include "runtime/icache.hpp"
      34 #include "runtime/init.hpp"
      35 #include "runtime/safepoint.hpp"
      36 #include "runtime/sharedRuntime.hpp"
      37 #include "services/memTracker.hpp"
      38 #include "utilities/macros.hpp"
      39
      40
      41 // Initialization done by VM thread in vm_init_globals()
      42 void check_ThreadShadow();
      43 void eventlog_init();
      44 void mutex_init();
      45 void chunkpool_init();
      46 void perfMemory_init();
      47
      48 // Initialization done by Java thread in init_globals()
      49 void management_init();
      50 void bytecodes_init();
      51 void classLoader_init();
      52 void codeCache_init();
      53 void VM_Version_init();
      54 void os_init_globals();        // depends on VM_Version_init, before universe_init
      55 void stubRoutines_init1();
      56 jint universe_init();          // depends on codeCache_init and stubRoutines_init
      57 void interpreter_init();       // before any methods loaded
      58 void invocationCounter_init(); // before any methods loaded
      59 void marksweep_init();
      60 void accessFlags_init();
      61 void templateTable_init();
      62 void InterfaceSupport_init();
      63 void universe2_init();  // dependent on codeCache_init and stubRoutines_init, loads primordial classes
      64 void referenceProcessor_init();
      65 void jni_handles_init();
      66 void vmStructs_init();
      67
      68 void vtableStubs_init();
      69 void InlineCacheBuffer_init();
      70 void compilerOracle_init();
      71 void compilationPolicy_init();
      72 void compileBroker_init();
      73
      74 // Initialization after compiler initialization
      75 bool universe_post_init();  // must happen after compiler_init
      76 void javaClasses_init();  // must happen after vtable initialization
      77 void stubRoutines_init2(); // note: StubRoutines need 2-phase init
      78
      79 // Do not disable thread-local-storage, as it is important for some
      80 // JNI/JVM/JVMTI functions and signal handlers to work properly
      81 // during VM shutdown
      82 void perfMemory_exit();
      83 void ostream_exit();
      84
      85 void vm_init_globals() {
      86   check_ThreadShadow();
      87   basic_types_init();
      88   eventlog_init();
      89   mutex_init();
      90   chunkpool_init();
      91   perfMemory_init();
      92 }
      93
      94
      95 jint init_globals() {
      96   HandleMark hm;
      97   management_init();
      98   bytecodes_init();
      99   classLoader_init();
     100   codeCache_init();
     101   VM_Version_init();
     102   os_init_globals();
     103   stubRoutines_init1();
     104   jint status = universe_init();  // dependent on codeCache_init and
     105                                   // stubRoutines_init1 and metaspace_init.
     106   if (status != JNI_OK)
     107     return status;
     108
     109   interpreter_init();  // before any methods loaded
     110   invocationCounter_init();  // before any methods loaded
     111   marksweep_init();
     112   accessFlags_init();
     113   templateTable_init();
     114   InterfaceSupport_init();
     115   SharedRuntime::generate_stubs();
     116   universe2_init();  // dependent on codeCache_init and stubRoutines_init1
     117   referenceProcessor_init();
     118   jni_handles_init();
     119 #if INCLUDE_VM_STRUCTS
     120   vmStructs_init();
     121 #endif // INCLUDE_VM_STRUCTS
     122
     123   vtableStubs_init();
     124   InlineCacheBuffer_init();
     125   compilerOracle_init();
     126   compilationPolicy_init();
     127   compileBroker_init();
     128   VMRegImpl::set_regName();
     129
     130   if (!universe_post_init()) {
     131     return JNI_ERR;
     132   }
     133   javaClasses_init();   // must happen after vtable initialization
     134   stubRoutines_init2(); // note: StubRoutines need 2-phase init
     135
     136 #if INCLUDE_NMT
     137   // Solaris stack is walkable only after stubRoutines are set up.
     138   // On Other platforms, the stack is always walkable.
     139   NMT_stack_walkable = true;
     140 #endif // INCLUDE_NMT
     141
     142   // All the flags that get adjusted by VM_Version_init and os::init_2
     143   // have been set so dump the flags now.
     144   if (PrintFlagsFinal) {
     145     CommandLineFlags::printFlags(tty, false);
     146   }
     147
     148   return JNI_OK;
     149 }
     150
     151
     152 void exit_globals() {
     153   static bool destructorsCalled = false;
     154   if (!destructorsCalled) {
     155     destructorsCalled = true;
     156     perfMemory_exit();
     157     if (PrintSafepointStatistics) {
     158       // Print the collected safepoint statistics.
     159       SafepointSynchronize::print_stat_on_exit();
     160     }
     161     if (PrintStringTableStatistics) { // deprecated
     162       SymbolTable::the_table()->dump_table(tty, "SymbolTable");
     163       StringTable::the_table()->dump_table(tty, "StringTable");
     164     }
     165     if (PrintStringTableStatisticsAtExit) {
     166       StringTable::the_table()->dump(tty, "StringTable");
     167     }
     168     if (PrintSymbolTableStatisticsAtExit) {
     169       SymbolTable::the_table()->dump(tty, "SymbolTable");
     170     }
     171     if (PrintSystemDictionaryStatisticsAtExit) {
     172       SystemDictionary::the_table()->dump(tty, "SystemDictionary");
     173     }
     174     ostream_exit();
     175   }
     176 }
     177
     178
     179 static bool _init_completed = false;
     180
     181 bool is_init_completed() {
     182   return _init_completed;
     183 }
     184
     185
     186 void set_init_completed() {
     187   assert(Universe::is_fully_initialized(), "Should have completed initialization");
     188   _init_completed = true;
     189 }