# HG changeset patch # User Doug Simon # Date 1399808599 -7200 # Node ID ddb3ef30fcd297df347e3e78be10136d1c1285f2 # Parent 9a63ccd660071e371e029210bd484aee86783b3a fixed livelock issue introduced by 063ec2920d21 diff -r 9a63ccd66007 -r ddb3ef30fcd2 src/share/vm/graal/graalRuntime.cpp --- a/src/share/vm/graal/graalRuntime.cpp Sat May 10 15:37:51 2014 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Sun May 11 13:43:19 2014 +0200 @@ -37,28 +37,41 @@ #include "utilities/debug.hpp" address GraalRuntime::_external_deopt_i2c_entry = NULL; -volatile int GraalRuntime::_state = uninitialized; +volatile GraalRuntime::State GraalRuntime::_state = uninitialized; +Thread* GraalRuntime::_initializingThread = NULL; -void GraalRuntime::initialize() { - { +bool GraalRuntime::should_perform_init() { + JavaThread* THREAD = JavaThread::current(); + if (_state != initialized) { + if (THREAD == _initializingThread) { + return false; + } MutexLocker locker(GraalInitialization_lock); if (_state == uninitialized) { _state = initializing; + _initializingThread = THREAD; + return true; } else { while (_state == initializing) { GraalInitialization_lock->wait(); } - return; } } + return false; +} + +void GraalRuntime::initialize() { + if (!should_perform_init()) { + return; + } uintptr_t heap_end = (uintptr_t) Universe::heap()->reserved_region().end(); uintptr_t allocation_end = heap_end + ((uintptr_t)16) * 1024 * 1024 * 1024; AMD64_ONLY(guarantee(heap_end < allocation_end, "heap end too close to end of address space (might lead to erroneous TLAB allocations)")); NOT_LP64(error("check TLAB allocation code for address space conflicts")); - ThreadToNativeFromVM trans(JavaThread::current()); JavaThread* THREAD = JavaThread::current(); + ThreadToNativeFromVM trans(THREAD); TRACE_graal_1("GraalRuntime::initialize"); JNIEnv *env = ((JavaThread *) Thread::current())->jni_environment(); @@ -103,6 +116,7 @@ { MutexLocker locker(GraalInitialization_lock); _state = initialized; + _initializingThread = NULL; } #if !defined(PRODUCT) && !defined(COMPILERGRAAL) diff -r 9a63ccd66007 -r ddb3ef30fcd2 src/share/vm/graal/graalRuntime.hpp --- a/src/share/vm/graal/graalRuntime.hpp Sat May 10 15:37:51 2014 +0200 +++ b/src/share/vm/graal/graalRuntime.hpp Sun May 11 13:43:19 2014 +0200 @@ -33,8 +33,10 @@ static address _external_deopt_i2c_entry; - enum { uninitialized, initializing, initialized }; - static volatile int _state; + enum State { uninitialized, initializing, initialized }; + static volatile State _state; + static Thread* _initializingThread; + static bool should_perform_init(); public: