diff src/share/vm/compiler/abstractCompiler.cpp @ 0:a61af66fc99e jdk7-b24

Initial load
author duke
date Sat, 01 Dec 2007 00:00:00 +0000
parents
children c18cbe5936b8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/vm/compiler/abstractCompiler.cpp	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,61 @@
+//
+// Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+//
+// This code is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License version 2 only, as
+// published by the Free Software Foundation.
+//
+// This code is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// version 2 for more details (a copy is included in the LICENSE file that
+// accompanied this code).
+//
+// You should have received a copy of the GNU General Public License version
+// 2 along with this work; if not, write to the Free Software Foundation,
+// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+//
+// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+// CA 95054 USA or visit www.sun.com if you need additional information or
+// have any questions.
+//
+
+#include "incls/_precompiled.incl"
+#include "incls/_abstractCompiler.cpp.incl"
+
+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);
+      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);
+      MutexLocker only_one(CompileThread_lock, thread);
+      assert(*state == initializing, "wrong state");
+      *state = initialized;
+      CompileThread_lock->notify_all();
+    }
+  }
+}