changeset 15589:ddb3ef30fcd2

fixed livelock issue introduced by 063ec2920d21
author Doug Simon <doug.simon@oracle.com>
date Sun, 11 May 2014 13:43:19 +0200
parents 9a63ccd66007
children 1e63e4b5ef6d
files src/share/vm/graal/graalRuntime.cpp src/share/vm/graal/graalRuntime.hpp
diffstat 2 files changed, 23 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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: