src/share/vm/compiler/abstractCompiler.cpp

Print this page

        

*** 23,64 **** #include "precompiled.hpp" #include "compiler/abstractCompiler.hpp" #include "runtime/mutexLocker.hpp" - void AbstractCompiler::initialize_runtimes(initializer f, volatile int* state) { - if (*state != initialized) { ! // We are thread in native here... ! CompilerThread* thread = CompilerThread::current(); ! bool do_initialization = false; ! { ! ThreadInVMfromNative tv(thread); ! ResetNoHandleMark rnhm; ! MutexLocker only_one(CompileThread_lock, thread); ! if ( *state == uninitialized) { ! do_initialization = true; ! *state = initializing; } else { ! while (*state == initializing ) { CompileThread_lock->wait(); } } } ! if (do_initialization) { ! // We can not hold any locks here since JVMTI events may call agents ! ! // Compiler(s) run as native ! (*f)(); ! // To in_vm so we can use the lock ! ThreadInVMfromNative tv(thread); ! ResetNoHandleMark rnhm; ! MutexLocker only_one(CompileThread_lock, thread); ! assert(*state == initializing, "wrong state"); ! *state = initialized; CompileThread_lock->notify_all(); - } - } } --- 23,65 ---- #include "precompiled.hpp" #include "compiler/abstractCompiler.hpp" #include "runtime/mutexLocker.hpp" ! bool AbstractCompiler::should_perform_init() { ! if (_compiler_state != initialized) { ! MutexLocker only_one(CompileThread_lock); ! ! if (_compiler_state == uninitialized) { ! _compiler_state = initializing; ! return true; } else { ! while (_compiler_state == initializing) { CompileThread_lock->wait(); } } } ! return false; ! } ! bool AbstractCompiler::should_perform_shutdown() { ! MutexLocker only_one(CompileThread_lock); ! _num_compiler_threads--; ! // Set state to shutting_down ! if (_compiler_state == failed) { ! assert (CompileBroker::is_compilation_disabled_forever(), " Must be set, otherwise thread waits forever"); ! _compiler_state = shutting_shown; ! } ! // Only the last thread will perform shutdown operations ! if (_num_compiler_threads == 0) { ! return true; ! } ! return false; ! } ! void AbstractCompiler::set_state(int state) { ! MutexLocker only_one(CompileThread_lock); ! _compiler_state = state; CompileThread_lock->notify_all(); }