--- old/src/share/vm/compiler/abstractCompiler.cpp 2013-10-03 14:52:48.885379003 +0200 +++ new/src/share/vm/compiler/abstractCompiler.cpp 2013-10-03 14:52:48.829379004 +0200 @@ -25,40 +25,41 @@ #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(); - } +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(); } } - if (do_initialization) { - // We can not hold any locks here since JVMTI events may call agents - - // Compiler(s) run as native - - (*f)(); + } + return false; +} - // To in_vm so we can use the lock +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; + } - ThreadInVMfromNative tv(thread); - ResetNoHandleMark rnhm; - MutexLocker only_one(CompileThread_lock, thread); - assert(*state == initializing, "wrong state"); - *state = initialized; - CompileThread_lock->notify_all(); - } + // 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(); }