abstractCompiler.cpp 2.2 KB
Newer Older
D
duke 已提交
1
//
2
// Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// 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.
//
19 20 21
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
// or visit www.oracle.com if you need additional information or have any
// questions.
D
duke 已提交
22 23 24
//


25 26 27
#include "precompiled.hpp"
#include "compiler/abstractCompiler.hpp"
#include "runtime/mutexLocker.hpp"
D
duke 已提交
28 29 30 31 32 33 34 35
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);
36
      ResetNoHandleMark rnhm;
D
duke 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
      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);
57
      ResetNoHandleMark rnhm;
D
duke 已提交
58 59 60 61 62 63 64
      MutexLocker only_one(CompileThread_lock, thread);
      assert(*state == initializing, "wrong state");
      *state = initialized;
      CompileThread_lock->notify_all();
    }
  }
}