Top


定義場所(file name)

hotspot/src/share/vm/interpreter/interpreterRuntime.cpp

名前(function name)

IRT_ENTRY(nmethod*,
          InterpreterRuntime::frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp))

本体部(body)

  {- -------------------------------------------
  (1) カレントスレッドの _do_not_unlock_if_synchronized フィールドを一時的に false にしておく.
      (See: UnlockFlagSaver)
      ---------------------------------------- -}

      // use UnlockFlagSaver to clear and restore the _do_not_unlock_if_synchronized
      // flag, in case this method triggers classloading which will call into Java.
      UnlockFlagSaver fs(thread);

  {- -------------------------------------------
  (1) (変数宣言など)
      ---------------------------------------- -}

      frame fr = thread->last_frame();
      assert(fr.is_interpreted_frame(), "must come from interpreter");
      methodHandle method(thread, fr.interpreter_frame_method());
      const int branch_bci = branch_bcp != NULL ? method->bci_from(branch_bcp) : InvocationEntryBci;
      const int bci = branch_bcp != NULL ? method->bci_from(fr.interpreter_frame_bcp()) : InvocationEntryBci;

  {- -------------------------------------------
  (1) CompilationPolicy::event()  (を各サブクラスがオーバーライドしたもの) を呼び出し, 
      JIT コンパイルを開始する.
      ---------------------------------------- -}

      nmethod* osr_nm = CompilationPolicy::policy()->event(method, method, branch_bci, bci, CompLevel_none, thread);

  {- -------------------------------------------
  (1) JIT コンパイルが完了した場合, 
      biased locking を使っているケースにおいては, 
      OSR する際には現在のスタックフレーム内に biased でロックされているものがいるとまずい (OSR に移行できない) ので, 
      現在のフレームでロックされている全てのオブジェクトについて 
      BiasedLocking::revoke() を呼んで revoke しておく.
      ---------------------------------------- -}

      if (osr_nm != NULL) {
        // We may need to do on-stack replacement which requires that no
        // monitors in the activation are biased because their
        // BasicObjectLocks will need to migrate during OSR. Force
        // unbiasing of all monitors in the activation now (even though
        // the OSR nmethod might be invalidated) because we don't have a
        // safepoint opportunity later once the migration begins.
        if (UseBiasedLocking) {
          ResourceMark rm;
          GrowableArray<Handle>* objects_to_revoke = new GrowableArray<Handle>();
          for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end();
               kptr < fr.interpreter_frame_monitor_begin();
               kptr = fr.next_monitor_in_interpreter_frame(kptr) ) {
            if( kptr->obj() != NULL ) {
              objects_to_revoke->append(Handle(THREAD, kptr->obj()));
            }
          }
          BiasedLocking::revoke(objects_to_revoke);
        }
      }

  {- -------------------------------------------
  (1) 結果をリターン
      ---------------------------------------- -}

      return osr_nm;
    IRT_END

This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.